Для моего ответа я предполагаю, что у вас есть представление vDays
со столбцами, которые соответствуют вашему снимку экрана: period
, availabledays
, year
.
Чтобы добавить любые периоды нулевого дняк вашим результатам, независимо от того, какой месяц может иметь ноль (что соответствует августу и любому другому месяцу с нулевыми днями), вы можете расширить свое представление следующим образом:
WITH Mths (Mth) AS (
SELECT 'January'
UNION SELECT 'February'
UNION SELECT 'March'
UNION SELECT 'April'
UNION SELECT 'May'
UNION SELECT 'June'
UNION SELECT 'July'
UNION SELECT 'August'
UNION SELECT 'September'
UNION SELECT 'October'
UNION SELECT 'November'
UNION SELECT 'December'
UNION SELECT 'April - January'
UNION SELECT 'April - February'
UNION SELECT 'April - March'
UNION SELECT 'April - May'
UNION SELECT 'April - June'
UNION SELECT 'April - July'
UNION SELECT 'April - August'
UNION SELECT 'April - September'
UNION SELECT 'April - October'
UNION SELECT 'April - November'
UNION SELECT 'April - December'
), Years (Year) AS (
SELECT DISTINCT year
FROM vDays
), ZeroPeriods (Mth, Years) AS (
SELECT Mth, Year
FROM Mths, Years
), JoinedData (Mth, AvailableDays, Year) AS (
SELECT Mth, 0, Years
FROM ZeroPeriods
UNION ALL
SELECT period, availabledays, year
FROM vDays
), GroupedData (Mth, AvailableDays, Year) AS (
SELECT Mth, SUM(AvailableDays), Year
FROM JoinedData
GROUP BY Mth, Year
)
SELECT *
FROM GroupedData
ORDER BY Year, CASE UPPER(LEFT(Mth, 3))
WHEN 'JAN' THEN 1 WHEN 'FEB' THEN 2 WHEN 'MAR' THEN 3
WHEN 'APR' THEN 4 WHEN 'MAY' THEN 5 WHEN 'JUN' THEN 6
WHEN 'JUL' THEN 7 WHEN 'AUG' THEN 8 WHEN 'SEP' THEN 9
WHEN 'OCT' THEN 10 WHEN 'NOV' THEN 11 ELSE 12 END;
Я разделил это на лотыотдельных запросов, хотя некоторые из них могут быть объединены в подзапросы, но если сделать это так, это станет намного понятнее.