SQL 聚合总和产生意外输出
Posted
技术标签:
【中文标题】SQL 聚合总和产生意外输出【英文标题】:SQL aggregate sum produces unexpected output 【发布时间】:2021-09-25 03:07:57 【问题描述】:我不明白sum
的工作原理。
对于 dbeaver 中的 PostgreSQL 表:
a | 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
生产
a | 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 a, b, c, d
。这意味着您会得到每组 a、b、c、d 的总和。
@alekscooper 根据您的期望,所有行的 sum_c 和 sum_d 的值都相同,这实际上是您想要的吗?
@forpas 我应该如何分组以获得整列的总和,请您解释一下吗?
您的预期结果是什么?
查询可能在语法上是正确的并提供结果,但group by
不是做你想做的事的方法。检查我的答案,还可以通过谷歌搜索“sql group by”以获取更多信息。
【参考方案1】:
group by
无法获得您想要的结果。
当您与 group by
聚合时,您会为 group by
之后的所有列创建组,并且对于这些组中的每一个,您都会获得聚合结果。
对于您的样本数据,一组是1,2,3,2
,对于这种值组合,您会得到c
的总和,即3
,因为该组中只有一行c=3
。
使用SUM()
窗口函数:
SELECT a, b, c, d,
SUM(c) OVER () sum_c,
SUM(d) OVER () sum_d
FROM abc
【讨论】:
以上是关于SQL 聚合总和产生意外输出的主要内容,如果未能解决你的问题,请参考以下文章
Pandas groupby 和聚合输出应包括所有原始列(包括未聚合的列)