我如何使用SUM()OVER()

ser*_*kan 18 sql sum

我无法理解这段代码的错误

ID      AccountID       Quantity
1          1               10           Sum = 10
2          1               5                = 10 + 5 = 15
3          1               2                = 10 + 5 + 2 = 17
4          2               7                = 7
5          2               3                = 7 + 3 = 10  

SELECT ID, AccountID, Quantity, 
       SUM(Quantity) OVER (PARTITION BY AccountID ) AS TopBorcT, 
FROM tCariH
Run Code Online (Sandbox Code Playgroud)

And*_*y M 27

好像您希望查询返回运行总计,但它必须为两个分区提供相同的值AccountID.

要获得运行总计SUM() OVER (),需要在之后添加ORDER BY子句PARTITION BY …,如下所示:

SUM(Quantity) OVER (PARTITION BY AccountID ORDER BY ID)
Run Code Online (Sandbox Code Playgroud)

但请记住,并非所有数据库系统都支持窗口聚合函数ORDER BYOVER子句.(例如,SQL Server直到最新版本SQL Server 2012才支持它.)

  • 为了澄清这一点:没有`order by`的sum()将简单地对该分区定义的组的所有值求和.顺便说一下:SQL Server是唯一支持窗口函数的(AFAIK)DBMS,不支持partition子句中的order.其他(PostgreSQL,Oracle,DB2,Teradata)没有这个限制 (10认同)
  • @RobertJeppesen:是的,但仅用于对窗口函数进行“排名”。仅在SQL Server 2012中添加了* aggregate *窗口函数中对“ ORDER BY”的支持。(请查看[SQL Server 2005版本](http://msdn.microsoft.com/zh-cn/library/ms189461该手册的%28v = sql.90%29.aspx),那里的内容就更清楚了。) (2认同)

UV.*_*UV. 8

如果你使用SQL 2012,你应该尝试

SELECT  ID, 
        AccountID, 
        Quantity, 
        SUM(Quantity) OVER (PARTITION BY AccountID ORDER BY AccountID rows between unbounded preceding and current row ) AS TopBorcT, 
FROM tCariH
Run Code Online (Sandbox Code Playgroud)

如果可用,按日期列更好的排序.


小智 6

查询将是这样的:

SELECT ID, AccountID, Quantity, 
       SUM(Quantity) OVER (PARTITION BY AccountID ) AS TopBorcT 

       FROM #Empl ORDER BY AccountID
Run Code Online (Sandbox Code Playgroud)

Partition by 与 group by 类似。这里我们按 AccountID 分组,因此 sum 将对应于 AccountID。

第一种情况, AccountID = 1 ,然后 sum(quantity) = 10 + 5 + 2 => 17 & For AccountID = 2,然后 sum(Quantity) = 7+3 => 10

所以结果看起来像附加的快照