SQL 总和产生意外输出
SQL aggregate sum produces unexpected output
我不明白 sum
是如何工作的。
对于 dbeaver 中的 PostgreSQL table:
一个
b
c
d
1
2
3
2
1
2
4
3
2
1
3
2
2
1
4
2
3
2
4
2
查询
select a, b, c, d, sum(c) as sum_c, sum(d) as sum_d from abc a group by a, b, c, d
产生
一个
b
c
d
sum_c
sum_d
1
2
3
2
3
2
1
2
4
3
4
3
2
1
3
2
3
2
2
1
4
2
4
2
3
2
4
2
4
2
我不明白为什么:我预计每行中的 sum_c
会是 18
,这是 c
和 sum_d
中值的总和出于同样的原因,将是 11
。
为什么 sum_c
和 sum_d
只复制每行 c
和 d
的值?
您无法通过 group by
获得您想要的结果。
当您使用 group by
进行聚合时,您会为 group by
之后的所有列创建组,并且对于这些组中的每一个,您都会获得聚合结果。
对于您的示例数据,一组是 1,2,3,2
并且对于此值组合,您得到 c
的总和,即 3
因为只有 1 行 c=3
组.
使用SUM()
window函数:
SELECT a, b, c, d,
SUM(c) OVER () sum_c,
SUM(d) OVER () sum_d
FROM abc
我不明白 sum
是如何工作的。
对于 dbeaver 中的 PostgreSQL table:
一个 | b | c | d |
---|---|---|---|
1 | 2 | 3 | 2 |
1 | 2 | 4 | 3 |
2 | 1 | 3 | 2 |
2 | 1 | 4 | 2 |
3 | 2 | 4 | 2 |
查询
select a, b, c, d, sum(c) as sum_c, sum(d) as sum_d from abc a group by a, b, c, d
产生
一个 | b | c | d | sum_c | sum_d |
---|---|---|---|---|---|
1 | 2 | 3 | 2 | 3 | 2 |
1 | 2 | 4 | 3 | 4 | 3 |
2 | 1 | 3 | 2 | 3 | 2 |
2 | 1 | 4 | 2 | 4 | 2 |
3 | 2 | 4 | 2 | 4 | 2 |
我不明白为什么:我预计每行中的 sum_c
会是 18
,这是 c
和 sum_d
中值的总和出于同样的原因,将是 11
。
为什么 sum_c
和 sum_d
只复制每行 c
和 d
的值?
您无法通过 group by
获得您想要的结果。
当您使用 group by
进行聚合时,您会为 group by
之后的所有列创建组,并且对于这些组中的每一个,您都会获得聚合结果。
对于您的示例数据,一组是 1,2,3,2
并且对于此值组合,您得到 c
的总和,即 3
因为只有 1 行 c=3
组.
使用SUM()
window函数:
SELECT a, b, c, d,
SUM(c) OVER () sum_c,
SUM(d) OVER () sum_d
FROM abc