2012-10-10 36 views
1

我有一个Microsoft SQL服务器枢查询得到的值之和,每个类别行,每月列1至12SQL Server的支点平均

我现在有13列的查询返回的,例如,无四月后的数据:

Category [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] 
----------------------------------------------------------------------------------- 
Food  150 200 0  125 null null null null null null null null 
Drink  140 0  90 115 null null null null null null null null 

每个类别,我需要添加值的总和,以及忽略无数据的月份的平均值。 对于上述数据,我需要添加列:

Sum Average 
475 118.75 
345  86.25 

我尝试了许多不同的方法,但我无法找到一个方法。

+1

你可以发布您的原始查询,表结构和一些样本数据?可能有几种方法可以做到这一点,并看到这些信息会有所帮助。 – Taryn

回答

2

这个查询怎么样?

Select * 
From 
(
    Select ItemName as Itm, [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12] 
    From 
    (
     Select ItemName, Month(EffectiveDate) as Mon, Val 
      From Items 

    ) as SourceTable 
    Pivot 
    (
     Sum(Val) 
     For Mon in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) 
    ) as PivotTable 
) A 
Cross Apply (Select SUM(Val) as SumVal, AVG(Val) as AvgVal From Items i Where i.ItemName = a.Itm) b 

参见图:

http://s18.postimage.org/lwbovyy49/results.jpg

+0

谢谢,这是一个干净的解决方案。 –

0

我知道这看起来很愚蠢,但它会做的。 :-)

Select Category,(isnull(f1,0)+isnull(f2,0)+isnull(f3,0)) as sumall, 
isnull((isnull(f1,0)+isnull(f2,0)+isnull(f3,0)),1)/isnull(nullif((0+(isnull(nullif(isnull(f1,isnull(f1,0)),f1),1))+(isnull(nullif(isnull(f2,isnull(f2,0)),f2),1))+(isnull(nullif(isnull(f3,isnull(f3,0)),f3),1))),0),1) as avr 
from MyTable 
+1

哦,不! :P。这太多了! – TCM

+0

对不起,我的例子只有3个月。复制/粘贴所有f场匹配12个月。 :-) – Romo

+0

真棒! :) 为什么不?? :-) – TCM