Sum(column_name) 和 sum(column_name) over (partition by id) 有啥区别
Posted
技术标签:
【中文标题】Sum(column_name) 和 sum(column_name) over (partition by id) 有啥区别【英文标题】:What is the difference between Sum(column_name) and sum(column_name) over (partition by id)Sum(column_name) 和 sum(column_name) over (partition by id) 有什么区别 【发布时间】:2018-05-15 07:06:54 【问题描述】:表 a 有两列 bpm_no 和 total_amount。我试图总结每个 bpm_no 的 total_amount,其中 bpm_no 可以重复,并且不同行的 total_amount 列可能不同。我正在使用两种方法,一种如下所示:
select
a.bpm_no,
sum(a.total_amount)
from table a
group by a.bpm_no, a.total_amount
我使用的另一种方法是按如下方法进行分区:
select
a.bpm_no,
sum(a.total_amount) over (partition by a.bpm_no)
from table a
group by a.bpm_no,a.total_amount
但是,我得到了不同的结果,使用第一种方法,它丢弃了一些值。使用第二种方法时,它会按预期显示每条记录。请解释哪一个是正确的,以及这两种方法的区别是什么。
【问题讨论】:
第一次查询会报错。 在那种情况下我怀疑你使用的是 sql-server sql-server 将在第一种情况下抛出错误,因为您缺少group by
子句。如果添加它,则第一个查询是正确的。它不会“丢弃”行,而是聚合它们。
第一个查询将导致“列 'a.bpm_no' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中”如果你真的在使用 SQL Server
' 它丢弃了一些值...' 这是一个简化的查询吗?您是否还在主查询中使用了联接?
【参考方案1】:
将第一个查询与 GROUP BY 一起使用应该可以满足您的要求
select a.bpm_no,
sum(a.total_amount)
from table a
GROUP BY a.bpm_no;
查看thisSQLFiddle 以供参考
【讨论】:
如果我使用这个查询,我会得到一个错误,将 a.total_amount 包含在 group by 中。当我使用 group by a.bpm_no, a.total_amount 时,虽然它给出了结果,但它再次丢弃了一些值。 它不应该给出错误请检查我在答案中添加的 SQLfiddle【参考方案2】:试试这个:
SELECT
a.bpm_no,
SUM(a.total_amount)
FROM
table a
GROUP BY
a.bpm_no
由于您没有使用group by
,所以它添加了所有值
****演示****
http://sqlfiddle.com/#!18/bb29b/2
【讨论】:
这项工作是否可行,因为它给了我一个错误,还包括 a.total_amount 在组中,当我这样做时,结果丢弃了一些 bpm_no。 这应该可以。您不能在group by
子句中包含 a.total_amount
,因为您要聚合该列
我添加了一个带有一些随机数据的 sqlfiddle 链接。请检查这是否是您想要的输出。【参考方案3】:
在第一个查询中,您应该按如下方式编辑 Group By 子句。
select
a.bpm_no,
sum(a.total_amount)
from table a
group by a.bpm_no
在第二种情况下,结果将如下。
select
a.bpm_no,
sum(a.total_amount) over (partition by a.bpm_no)
from table a
group by a.bpm_no
在所有查询列中使用聚合,而不是在 Group By 子句中使用。
【讨论】:
以上是关于Sum(column_name) 和 sum(column_name) over (partition by id) 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章