2014-02-20 25 views
1

分组假设像这样的表:一列的条件的总和,然后全部由第三

| A | B | C | 
------------- 
| a | 1 | 1 | 
| a | 4 | 1 | 
| b | 2 | 1 | 
| b | 6 | 3 | 
| a | 4 | 6 | 
| b | 2 | 7 | 

我想要得到的B总和由A分组的C不同的频段。我可以通过一个内部查询使每带一个新列做有那些当我要总结的价值观和零,我不喜欢这样的:

SELECT A, SUM(B*band_1) as band_1, SUM(B*band_2) as band_2 
FROM (SELECT A, 
      B, 
      CASE 
       WHEN C <= 5 THEN 1 
       ELSE 0 
      END as band_1, 
      CASE 
       WHEN C > 5 and C <= 10 THEN 1 
       ELSE 0 
      END as band_2 
     FROM MyTable) as T 
GROUP BY A 

其中一期工程。但是当我有很多乐队时,这个查询会变得相当笨拙。有没有更好的方法来做到这一点?也许使用PIVOT或动态SQL甚至OLAP或什么?

+0

哦,我喜欢这个问题 – gsharp

+0

你有一个模式那些乐队?你知道在查询之前会有多少乐队? – EricZ

+0

@EricZ我不确定是否会有模式,但我一定会事先知道乐队。如果你有一个依赖于模式的解决方案,它仍然可能值得一看...... – Dan

回答

3

我不知道为什么你需要一个子查询,如果你没有带A的模式,也许尝试这种方式

SELECT A, 
    SUM(CASE WHEN C <= 5 THEN B ELSE 0 END) as band_1, 
    SUM(CASE WHEN C > 5 and C <= 10 THEN B ELSE 0 END) as band_2 
FROM MyTable 
GROUP BY A 
+0

是的 - 我当时很愚蠢。我也检查过,有一种模式。它<= 5,5 - 15,15 - 25等...有没有一个聪明的方法来做到这一点?我从来没有在TSQL中试过循环 – Dan

相关问题