带分组依据的SQL字符串出现的总和

时间:2019-06-21 23:13:12

标签: mysql sql

我有一个名为 battery_data

的表
+-------+-------+-------+-------+-------+-------+-------+
|Module |Machine| Num1 |  Num3 | Field | Value | Value2 |
+-------+-------+-------+-------+-------+-------+-------+
| T-01  |  A&B  |   23.9|  123  |   Cell|  POS  | 328.34|
| T-01  |  A&B  |   27.0|  456  |Battery|  POS  |   23.8|
| T-01  |  C&D  | 409.01|  789  | EV    |  NEG  | NULL  |
| T-01  |  C&D  | 411.02|  124  | Cell  |  VSB  | NULL  |
| T-02  |  A&B  | 509.01|  989  | EV    |  NEG  | NULL  |
| T-02  |  A&B  | 611.02|  824  |Battery|  VSB  | NULL  |
+-------+-------+-------+-------+-------+-------+-------+

我想要一个输出,该输出返回每个唯一模块和唯一机器汇总的 Value 字段中所有 POS / NEG / VSB 的出现。 (只有两种类型的机器:A&B,C&D)

如果未为模块找到某个值(POS / NEG / VSB),则该列应返回0。

我想生成一个输出表,

+-------+-------+-------+-------+-------+
|Module |Machine|  POS  |  NEG  |  VSB  |
+-------+-------+-------+-------+-------+
|  T-01 |  A&B  |   2   |  0    |   0   | 
|  T-01 |  C&D  |   0   |  1    |   1   | 
|  T-02 |  A&B  |   0   |  1    |   1   |   
+-------+-------+-------+-------+-------+

要实现此目标的SQL查询应该是什么?

1 个答案:

答案 0 :(得分:2)

好吧,正如您所说,您想找到“按唯一模块和唯一机器汇总的“值”字段中所有POS / NEG / VSB的出现”。因此,首先,您必须按模块和机器分组,然后对于每一行,必须计算其值是POS还是NEG或VSB。一种方法是为每个可能的值使用不同的计数器,然后增加与当前行的值相对应的计数器。一种方法是:

SELECT Module, Machine,
SUM(CASE WHEN Value = 'POS' THEN 1 ELSE 0 END) AS POS,
SUM(CASE WHEN Value = 'NEG' THEN 1 ELSE 0 END) AS NEG,
SUM(CASE WHEN Value = 'VSB' THEN 1 ELSE 0 END) AS VSB
FROM battery_data
GROUP BY Module, Machine