繁体   English   中英

如何通过不改变结构来总结使用 SQL 的分组结果的总和?

[英]How to sum up the sums of grouped results with SQL by NOT altering the structure?

我有一列名称 [name])、一列我想总结的整数值 ([Values]) 和另一列整数值 ([Day])。 我想总结每天按名称分组的值。 因此,例如,如果在第 1 天有一个值为 4 的名称“Chris”,并且在第 3 天有另一个值为 2 的条目“Chris”,我想显示第 1 (4) 天和第 2 天的 Chris 总和(4+2=6)。

正如上面的例子(“克里斯”),我想总结一下,显示每天每个名字的总和(从第 1 天到第 x 天的总和):

select name, day,
sum(value) over (partition by name order by day) total
from tablename 

这有效但是:我实际上需要保留表的结构,因为实际上还有一个带有名称(name2)的列我需要遵循数据的原始顺序,因为每个名称都唯一地分配给另一个名称的另一列中同一行。 然后,在每一行中,名称都分配给该行的特定值。 后来,我想用每对名称分别计算它们的值(值的总和)进一步的结果。 有谁知道如何解决这个问题?

编辑:

桌子

抱歉,我无法正确插入表格,因此这里的图像显示我想根据左侧 5 列中的值创建红色标记的值。

根据您的描述,您只想将name2添加到partition by子句中:

select t.*,
       sum(value) over (partition by name, name2 order by day) as total
from tablename  t;

从您从请求中链接到的图像看来,您似乎希望order by day, valueorder by day, value运行总计order by day, value

select 
  t.*
  sum(value) over (order by day, value) as sumvalue,
  sum(value2) over (order by day, value) as sumvalue2,
  sum(value) over (order by day, value) * sum(value2) over (order by day, value) as result
from tablename t
order by day, value;

使用sum()窗口函数和CTE s:

with 
  ctable as (
    select t.*, row_number() over(order by (select null)) rn
    from tablename t
  ),
  cte as (  
    select c.name, c.day, c.value, c.name2, c.value2,
    sum(c.value) over(order by rn) SumValue,
    sum(c.value2) over(order by rn) SumValue2
    from ctable c
  )
select c.*, SumValue + SumValue2 Result
from cte c

请参阅演示
结果:

> name  | day | value | name2 | value2 | SumValue | SumValue2 | Result
> :---- | --: | ----: | :---- | -----: | -------: | --------: | -----:
> Chris |   1 |     2 | Paul  |      5 |        2 |         5 |      7
> Alice |   1 |     5 | Ken   |      4 |        7 |         9 |     16
> Paul  |   2 |     8 | Alice |      1 |       15 |        10 |     25
> Ken   |   2 |    11 | Chris |      2 |       26 |        12 |     38
> Alice |   3 |    14 | Ken   |      3 |       40 |        15 |     55
> Chris |   3 |    17 | Paul  |      0 |       57 |        15 |     72

我使用SumValue + SumValue2来计算结果,因为在问题中你说: "sum of values" 但在预期结果中,您使用乘法符号* 如果您不想要总和但产品,则相应地更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM