【问题标题】:How to make a SUM without group by如何在没有分组的情况下进行 SUM
【发布时间】:2013-10-16 18:56:42
【问题描述】:

这是我的问题..

Actual   Auction   Ammanat   id
7000     500       100       228,229
7000     100       100       228,229
7000     900       100       228,229
5000     0         0         230

我想要下面给出的结果

Actual   Auction   Ammanat   Remaining  id
7000     500       100       5550       228,229
7000     100       100       5550       228,229
7000     900       100       5550       228,229
5000     0         0         5000        230

这里,Remaining(sum(auction)-actual)

我正在使用 PostgreSQL。但如果有人知道 SQL Server 中的解决方案,就可以了。

【问题讨论】:

  • (sum(auction)-actual) 没有意义。应该是actual - sum(auction)

标签: sql sql-server postgresql window-functions


【解决方案1】:

你需要一个使用窗口函数 - http://www.postgresql.org/docs/9.3/static/tutorial-window.html

类似:

(Sum(Auction) OVER ()) - actual AS Remaining

【讨论】:

  • 非常感谢...我也想问一下,如何在SQL中处理这个问题?
  • SQL Server 也有这个功能,语法相同:technet.microsoft.com/en-us/library/ms189461.aspx
  • 我觉得应该是actual - Sum(Auction) OVER (PARTITION BY id) AS Remaining
  • 您好!如果我执行:SELECT sum(x) FROM data 结果是:“错误:列“x”必须出现在 GROUP BY 子句中或在聚合函数中使用”... 而如果执行:SELECT sum(x)作为 my_label FROM data 工作正常.... :SI 正在使用 postgresql... 解决方案是否添加别名???
  • @Gabriel - 这与原始问题并没有真正的关系 - OP 询问了有关将聚合与单个行一起使用的问题,而您询问的是尝试使用简单聚合时出现的一般错误。这值得自己提出问题(或者甚至可能是 PostgreSQL 问题跟踪器中的一张票,因为它看起来确实像一个错误......)
【解决方案2】:

伊丹是 100% 正确的。我想对此进行解释:

(SUM (Auction) OVER ())
  • OVER () 创建一个窗口,包括来自原始查询的所有行
  • SUM (Auction) 是一个窗口函数,它计算Auction 的总和。

下面是进一步的解释:

  • Window 是查询结果集中用户指定的一组行。

  • 窗口函数计算窗口中所有行的值(例如SUM)。

  • 所有行都在窗口中,因为OVER() 不包括PARTITION BY。使用PARTITION BY,窗口将包含行的子集。

From MSDN:

...OVER 子句在查询结果集中定义一个窗口或用户指定的一组行。然后,窗口函数为窗口中的每一行计算一个值。您可以将 OVER 子句与函数一起使用来计算聚合值……如果 OVER 子句不包括 PARTITION BY。这意味着该函数将应用于查询返回的所有行。

【讨论】:

  • 谢谢你。
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 2010-11-07
  • 2021-10-28
  • 1970-01-01
相关资源
最近更新 更多