2013-07-10 27 views
2

考慮下面的表結構SQL分組和骨料基於不同的記錄類型

ADateTime AGroupName ARecordType AValue 
========== ========== =========== ====== 
2013-01-01 Ninjas  A    10 
2013-01-01 Ninjas  B    5 
2013-01-01 Ninjas  C    2 
2013-01-01 Ninjas  D    1 
2013-01-01 Ninjas  E    0 
2013-01-01 Clowns  A    8 
2013-01-01 Clowns  B    4 
2013-01-01 Clowns  E    1 
2013-01-08 Ninjas  A    7 
2013-01-08 Ninjas  B    3 
2013-01-08 Ninjas  E    1 
2013-01-08 Clowns  A    4 
2013-01-08 Clowns  B    3 

我需要計算2個值(CalcVal1和CalcVal2),用於ADateTime和AGroupName的每個組合。換句話說,我需要GROUP BY ADateTime和AGroupName(這是簡單的部分)。

注意:從示例數據中可以看出,不能保證給定分組會存在特定的記錄類型......因此,如果需要/必要時外連接和聚合!

我想弄清楚的是如何根據ARecordType的值計算CalcVal1和CalcVal2。以下是在規範CalcVal1和CalcVal2 ...

  1. CalcVal1是(安勤的總和,其中ARecordType = 'A')
  2. CalcVal2是安勤的(SUM其中ARecordType IN( 'B',」 C '))減去 安勤的(總和,其中ARecordType IN(' d」, 'E'))

的結果集我想到的是

ADateTime AGroupName CalcVal1 CalcVal2 
========== ========== ======== ======== 
2013-01-01 Ninjas  10   6 
2013-01-01 Clowns  8    3 
2013-01-08 Ninjas  7    2 
2013-01-08 Clowns  4    3 

我使用T-SQL在SQL-Server 2005上。SQL或存儲的P rocedures歡迎。 TIA,我太老了,這是他們讓我成爲CTO的時間! (;-D)

回答

4

您可以有條件聚集做到這一點,幾乎是你的方式描述的那樣:

select ADateTime, AGroupName, 
     SUM(case when ARecordType = 'A' then AValue else 0 end) as CalcVal1, 
     (SUM(case when ARecordType in ('B', 'C') then AValue else 0 end) - 
     SUM(case when ARecordType in ('D', 'E') then AValue else 0 end) 
     ) as CalcVal2 
from t 
group by ADateTime, AGroupName 
+0

+1 YAY,我升職了,掐我我一定是在做夢! – Sam

+0

@Sam。 。 。恭喜。 –