Сумма 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  |
+-------+-------+-------+-------+-------+-------+-------+

Мне нужен вывод, который возвращает вхождения всех 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-запрос для этого?

Какую базу данных вы используете? Вы отметили 4 разных.

Shawn 22.06.2019 01:23

я использую mysql

Cyber_Tron 22.06.2019 01:24

Вам нужно условная агрегация с GROUP BY.

PM 77-1 22.06.2019 01:27
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
470
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ну, как вы говорите, вы хотите найти «вхождения всех 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
Является ли «попробовать это» плохой практикой?Попробуй это не является ответом, и просто сброс кода не дает никаких знаний. Вместо попробуй это напишите ответ, который объясняет, как это решает проблему и как это работает, чтобы этот автор (и будущие читатели здесь) действительно узнали из него что-то, что они могут применить позже, когда столкнутся с новыми проблемами.
Ken White 22.06.2019 02:03

@KenWhite большое спасибо! Я ценю ваши отзывы, я новичок в ответах на вопросы в SO, и я хочу помочь, поэтому я буду применять это на практике.

Sebastian Paciuk 22.06.2019 02:14

Под вашим ответом есть ссылка редактировать. Вы можете начать прямо сейчас. :-)

Ken White 22.06.2019 02:15

Другие вопросы по теме