2014-05-03 54 views
0

我试图计算下面的查询SQL服务器上运行超过总,分

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) 

运行总计但我得到一个错误:

Msg 8120, Level 16, State 1, Line 3
Column 't_Stock.Qty' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

为什么“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 
+0

@ M.Ali,我选择的答案这确实解决了问题,其余的我没有。 –

回答

6

当使用带有聚集窗口函数,你实际上需要嵌套的结果。这里是你的查询应该工作的版本:

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); 

我不知道你打算怎么处理这个。 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); 
0

写为:

select a.ICode,MONTH(a.VDate), YEAR(a.vdate) 
, sum(isnull(a.qty,0)) OVER(partition by a.icode order by a.icode) 
    AS 'Runningtotal' 
, sum(isnull(a.qty,0)) OVER(partition by a.icode,MONTH(a.VDate), YEAR(a.vdate) 
    order by a.icode,YEAR(a.vdate),MONTH(a.VDate)) 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) 
+0

我以前试过这个查询,执行时需要很多时间。 –

+0

请从表格中发布一些数据t_Stock它会更容易解释为什么需要两个窗口函数才能获得这些总数 – Deepshikha

+0

这也不会得到相同的结果 - 假设't_stock'中有多行,您的版本将保留他们,而(尝试)原创则不会。 @NitinKabra - 至少部分速度问题是'YEAR()'和'MONTH()'可能会强制执行表扫描(取消使用任何索引来获取VDate)。是的,请让我们开始数据和期望的结果。 –

1

为什么“t_Stock.Qty”需要在GROUP BY子句,因为我已经使用聚合函数(总和(a.Qty))?

这个问题似乎是因为u使用 “SUM(东西)”,然后u使用 “SUM(东西)在(分区由...)”
当u使用 “SUM(东西)”
则需要“群由...”条款 但是当u使用“SUM(东西)在(分区由...)”,它不接受/需要一个“按组..”条款 http://technet.microsoft.com/en-us/library/ms189461.aspx


之间选择一个。

,如果你想使用这两者,请尝试以下查询:

select a.ICode,MONTH(a.VDate) as 'month', YEAR(a.vdate) as 'year' 
, bb.xtotal 
,sum(isnull(a.qty,0)) OVER (partition by a.icode order by a.icode) AS 'total' 
from 
@temp a 
inner join 
(
select b.ICode, b.vdate, 
    sum(isnull(b.qty,0)) as xtotal 
from @temp b 
group by b.Icode, b.vdate 
) bb on a.Icode = bb.Icode and bb.vdate = a.vdate 
order by a.icode,YEAR(a.vdate),MONTH(a.VDate)