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_csum_d 只是在每一行中复制cd 中的值?

【问题讨论】:

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 和聚合输出应包括所有原始列(包括未聚合的列)

Javascript - 无法读取 json 键值 - JSON 中位置 1 的意外令牌 i - sql 查询输出问题

通过 pyspark 中的 UDF 读取文本文件返回意外输出