SQL聚合取决于未选择列中的属性值

时间:2018-03-07 22:08:18

标签: sql sql-server

我有一张TABLE1这样的表:

|--------------|--------------|--------------|
|      POS     |     UNIT     |    VOLUME    |
|--------------|--------------|--------------|
|       1      |      M2      |     20       |
|       1      |      M2      |     30       |
|       1      |      M3      |     40       |
|       2      |      M2      |     100      |
|       2      |      M3      |     20       |
|       3      |      ST      |     30       |
|       3      |      M2      |     10       |
|--------------|--------------|--------------|

取决于列UNIT的值,我想按以下方式聚合(每个UNIT成为一个新列,其中包含相应值的总和):

|--------------|--------------|--------------|--------------|
|      POS     |   VOLUME_M2  |   VOLUME_M3  |   VOLUME_ST  |
|--------------|--------------|--------------|--------------|
|       1      |      50      |      40      |       0      |
|       2      |      100     |      20      |       0      |
|       3      |      10      |      0       |      30      |
|--------------|--------------|--------------|--------------|

我的解决方案是

SELECT POS,
       CASE
            WHEN UNIT = 'M2' 
                THEN SUM(VOLUME)
                ELSE 0
            END AS VOLUME_M2,
       CASE
            WHEN UNIT = 'M3' 
                THEN SUM(VOLUME)
                ELSE 0
            END AS VOLUME_M3,
       CASE
            WHEN UNIT = 'ST' 
                THEN SUM(VOLUME)
                ELSE 0
            END AS VOLUME_S
FROM TABLE1
GROUP BY POS, UNIT

我的问题是,如果我在GROUP BY语句中遗漏UNIT我的代码不起作用(我必须在我的聚合或我的GROUP BY语句中使用它)

因此我得到这样的东西:

|--------------|--------------|--------------|--------------|
|      POS     |   VOLUME_M2  |   VOLUME_M3  |   VOLUME_ST  |
|--------------|--------------|--------------|--------------|
|       1      |      50      |      0       |       0      |
|       1      |      0       |      40      |       0      |
|       2      |      0       |      20      |       0      |
|       2      |      100     |      0       |       0      |
|       3      |      10      |      0       |       0      |
|       3      |      0       |      0       |      30      |
|--------------|--------------|--------------|--------------|

此外,任何人都可以给我一个提示,如何自动获得这种类型的结果(特别是如果UNIT有很多值)。

1 个答案:

答案 0 :(得分:2)

关闭。对于条件聚合,case表达式是聚合函数的参数:

SELECT POS,
       SUM(CASE WHEN UNIT = 'M2' THEN VOLUME ELSE 0 END) AS VOLUME_M2,
       SUM(CASE WHEN UNIT = 'M3' THEN VOLUME ELSE 0 END) AS VOLUME_M3,
       SUM(CASE WHEN UNIT = 'ST' THEN VOLUME ELSE 0 END) AS VOLUME_ST
FROM TABLE1
GROUP BY POS;