我有一个名为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 |
+-------+-------+-------+-------+-------+-------+-------+
我想要一个输出,该输出返回按唯一模块和唯一机器汇总的“值”字段中所有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查询应如何实现此目标?
最佳答案
好了,正如您所说,您想找到“每个唯一模块和唯一机器汇总的Value字段中所有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