我有一个名为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

10-08 07:57