У меня есть таблица с именем 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/ОТРИЦАТЕЛЬНЫЙ/VSB в поле Стоимость, агрегированные для уникальный модуль и уникальная машина. (Есть только 2 типа машин: 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-запрос для этого?
я использую mysql
Вам нужно условная агрегация с GROUP BY.






Ну, как вы говорите, вы хотите найти «вхождения всех POS/NEG/VSB в поле Value, агрегированные для каждого уникального модуля и уникальной машины». Итак, сначала вы должны сгруппировать по модулю и машине, а затем для каждой строки вы должны подсчитать, является ли ее значение 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
@KenWhite большое спасибо! Я ценю ваши отзывы, я новичок в ответах на вопросы в SO, и я хочу помочь, поэтому я буду применять это на практике.
Под вашим ответом есть ссылка редактировать. Вы можете начать прямо сейчас. :-)
Какую базу данных вы используете? Вы отметили 4 разных.