SQL: добавьте несколько предложений where в один запрос

Я хочу запустить SQL-запрос из Node.js. В настоящее время я показываю общее количество проектов, имеющих определенный статус в каждом из 4 кварталов. Что я хочу сделать сейчас, так это показать тот же результат, но добавив еще одно условие, то есть финансовый год.

Вот мой код для 4 кварталов:

SELECT 
SUM(CurrentStatus = 'On Hold') onHold_Q,
SUM(CurrentStatus = 'In Progress') inProgress_Q,
SUM(CurrentStatus = 'Not Started') notStarted_Q,
SUM(CurrentStatus = 'Completed') completed_Q,
SUM(CurrentStatus = 'Routine Activity') routineActivity_Q,
SUM(CurrentStatus = 'Done But Not Published') doneButNotPublished_Q
FROM office.officedata
WHERE Quarter in ('Q1', 'Q2', 'Q3', 'Q4')    //here I want to add one more condition FiscalYear in ('2016-17')
GROUP BY Quarter
ORDER BY Quarter;

Это печатает вывод в 4 разных строках, что мне и нужно. Но когда я добавляю еще одно условие, оно выполняется, но печатается только одна строка, поскольку проектов в остальные 3 квартала этого года не существует. Я хочу каким-то образом напечатать 4 разных строки для кварталов за каждый финансовый год. Запрос должен вывести 0 в строке, если для этого квартала в году не существует проектов. Как мне это сделать? Мой SQL не так силен, было бы здорово, если бы кто-нибудь мог мне помочь.

Вы должны использовать динамически сгенерированный источник строк (подзапрос), который содержит все комбинации (год-квартал) за необходимый период, и LEFT JOIN ваши данные к нему.

Akina 24.12.2020 06:10

Не подскажешь программно как это сделать? Мой SQL не такой сильный.

Package.JSON 24.12.2020 06:21

Не храните «Q»

Strawberry 24.12.2020 08:44

@Клубничка, почему?

Package.JSON 24.12.2020 08:45

это расточительно и избыточно. И, как правило, сравнение строк занимает немного больше времени, чем сравнение целых чисел (хотя на практике это тривиальное соображение).

Strawberry 24.12.2020 08:50
Освоение архитектуры микросервисов с 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
5
121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Не подскажешь программно как это сделать?

SELECT years.FiscalYear, quarters.Quarter,
SUM(CurrentStatus = 'On Hold') onHold_Q,
SUM(CurrentStatus = 'In Progress') inProgress_Q,
SUM(CurrentStatus = 'Not Started') notStarted_Q,
SUM(CurrentStatus = 'Completed') completed_Q,
SUM(CurrentStatus = 'Routine Activity') routineActivity_Q,
SUM(CurrentStatus = 'Done But Not Published') doneButNotPublished_Q
FROM (SELECT 2016 FiscalYear UNION SELECT 2017) years
CROSS JOIN (SELECT 'Q1' Quarter UNION SELECT 'Q2' UNION SELECT 'Q3' UNION SELECT 'Q4') quarters
LEFT JOIN office.officedata ON office.FiscalYear = years.FiscalYear AND office.Quarter = quarters.Quarter 
GROUP BY years.FiscalYear, quarters.Quarter
ORDER BY years.FiscalYear, quarters.Quarter;

Возможно, SUM должны быть заключены в COALESCE(), чтобы заменить NULL нулями.

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