【问题标题】:Build a SQL with sum使用 sum 构建 SQL
【发布时间】:2016-06-17 17:40:48
【问题描述】:

这是我的表 - PK 是(Con_num、版本、顺序):

Con_num version operation amount
15      1       A         1
15      1       B         2
15      1       C         3
15      2       A         4
15      3       A         5
15      3       B         6
15      4       C         7
  • Con_num 是合同编号。
  • version 是版本号。
  • operation 只是一个操作的 ID。
  • amount 是操作的数量。

我想知道每个版本的总金额。棘手的部分是:对于第 1 版,我只需要将金额相加。但是对于版本 2,我需要对版本 2 行求和(操作 = A)并从版本 1 中获取两行(操作!= A)。因此,对于版本 3,我将取版本 3 的两行,并且只取版本 1 中 operation = C 的行。任何新操作都会使之前版本中的操作无效。

结果将是:

Con_num version amount
15      1       6     (1 + 2 + 3)
15      2       9     (4 + 2 + 3)
15      3       14    (5 + 6 + 3)
15      4       18    (5 + 6 + 7)

我该怎么做?

【问题讨论】:

  • 每个级别的规则似乎不一致。如果version 等于 4 会发生什么? 5个或6个怎么样?
  • 我看不出问题所在。我们应用相同的计算。只取每个订单的最后一个版本
  • 您能否显示您想要的版本 4 或 5 的输出,以便更清楚地理解逻辑。因为这里与此示例规则似乎不一致
  • 如果您的示例中的每个金额值都是唯一的,这可能会有所帮助,以便我们知道每个金额来自哪一行,正如您将在下面看到的那样,我认为我理解了 - 但显然没有

标签: oracle11g


【解决方案1】:

对于每个 con_numversion 将所有记录相加

  • 同样的con_num
  • 没有version 大于有问题的version
  • 具有最高的versionoperation

获取最高版本记录的数量可以通过Oracle的KEEP FIRST/LAST解决:

select 
  base.con_num, 
  base.version,
  (
    select sum(max(mytable.amount) keep (dense_rank last order by mytable.version))
    from mytable
    where mytable.con_num = base.con_num
    and mytable.version <= base.version
    group by mytable.con_num, mytable.operation
  ) as total
from (select distinct con_num, version from mytable) base;

【讨论】:

  • 就是这样。坦克你。
【解决方案2】:
select
  Con_num, version, orderno, a0+a1+a2 as amount
from (
    select
          Con_num, version, orderno
        , lag(amount,2) over(partition by Con_num order by version, orderno) a2
        , lag(amount,1) over(partition by Con_num order by version, orderno) a1
        , amount a0
        , row_number() over(partition by Con_num, version order by orderno desc) as rn
    from table1
    ) d
where rn = 1

您似乎只想要 (Con_num, version, orderno) 的“最新”组合,可以使用 row_number() 和使用 lag(,1) 和 lag(,2) 确定所需的值,但我不'没有达到规定的结果。

结果:

| con_num | version | orderno | amount |
|---------|---------|---------|--------|
|      15 |       1 |       3 |     37 |
|      15 |       2 |       1 |     42 |
|      15 |       3 |       2 |     35 |

sqlfiddle example

【讨论】:

  • 订单不应该在这里。
  • @StevenBENET 您应该向那些花时间尝试回答您的问题的人提供更好的反馈。
【解决方案3】:

使用 LAST_VALUE 分析函数。

select con_num, version, q1+q2+q3
from (
    select x.*, 
    last_value(case when operation = 1 then amount end) ignore nulls over (order by version) q1,
    last_value(case when operation = 2 then amount end) ignore nulls over (order by version) q2,
    last_value(case when operation = 3 then amount end) ignore nulls over (order by version) q3
    from x
)
group by con_num,version, q1, q2, q3
order by con_num,version;

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多