[英]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, value
按order 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.