Я хочу запустить 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 не так силен, было бы здорово, если бы кто-нибудь мог мне помочь.
Не подскажешь программно как это сделать? Мой SQL не такой сильный.
Не храните «Q»
@Клубничка, почему?
это расточительно и избыточно. И, как правило, сравнение строк занимает немного больше времени, чем сравнение целых чисел (хотя на практике это тривиальное соображение).
Не подскажешь программно как это сделать?
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 нулями.
Вы должны использовать динамически сгенерированный источник строк (подзапрос), который содержит все комбинации (год-квартал) за необходимый период, и LEFT JOIN ваши данные к нему.