sql server运行总计用,分区

Nit*_*bra 1 sql sql-server sql-server-2012

我试图在以下查询中计算运行总计

select 
    a.ICode, MONTH(a.VDate), YEAR(a.vdate)
    , sum(isnull(a.qty, 0))
    , sum(isnull(a.qty, 0)) OVER (partition by a.icode order by a.icode) AS 'total' 
from 
    t_Stock as a
group by 
    a.ICode, MONTH(a.VDate), YEAR(a.vdate)
order by 
    a.icode, YEAR(a.vdate), MONTH(a.VDate)
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

消息8120,级别16,状态1,行3
列"t_Stock.Qty"在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.

为什么' t_Stock.Qty'需要在GROUP BY子句中,因为我已经在使用聚合函数(Sum(a.Qty))

一些演示数据:

icode   vtype   qty   vdate 
32114   Sales   -2    2013-06-03 18:09:17.953 
33459   Sales   -1    2013-06-03 19:39:59.843 
34446   Sales   -1    2013-06-03 20:46:17.030 
39914   Tra     -3    2014-01-07 13:02:31.000
30899   Sales   -1    2013-06-04 11:48:06.267 
25676   Sales   -3    2013-06-04 17:34:01.470 
32126   Sales   -1    2013-06-04 18:12:44.267 
34688   Sales   -1    2013-06-04 18:40:52.750 
31550   Sales   -1    2013-06-04 19:26:40.937 
32795   Sales   -1    2013-06-05 12:03:00.250 
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 7

使用带聚合的窗口函数时,实际上需要嵌套结果.以下是您应该使用的查询版本:

select a.ICode, MONTH(a.VDate), YEAR(a.vdate),
       sum(isnull(a.qty, 0)),
       sum(sum(isnull(a.qty, 0))) OVER (partition by a.icode order by a.icode) AS total
from t_Stock a
group by a.ICode, MONTH(a.VDate), YEAR(a.vdate)
order by a.icode, YEAR(a.vdate), MONTH(a.VDate);
Run Code Online (Sandbox Code Playgroud)

我不确定你打算怎么做.具有order by包含相同的值partition by是不寻常的.我希望这样的事情:

select a.ICode, MONTH(a.VDate), YEAR(a.vdate),
       sum(isnull(a.qty, 0)),
       sum(sum(isnull(a.qty, 0))) OVER (partition by a.icode
                                        order by year(a.vdate), month(a.vdate)
                                       ) AS total
from t_Stock a
group by a.ICode, MONTH(a.VDate), YEAR(a.vdate)
order by a.icode, YEAR(a.vdate), MONTH(a.VDate);
Run Code Online (Sandbox Code Playgroud)