TSQL - возвращать записи для каждого месяца между начальной и конечной датами, даже если данные за этот месяц отсутствуют - PullRequest
1 голос
/ 23 мая 2019

Мой текущий результат запроса SELECT выглядит следующим образом

SELECT Category, MonthYear, Percentage 
FROM #Result

С @StartDate как 2018-12-01 и @EndDate как 2019-05-01

Category  | MonthYear  | Percentage
----------+------------+------------    
Category1 | 2018-12-01 | 80 
Category1 | 2019-01-01 | 70
Category1 | 2019-02-01 | 75
Category1 | 2019-03-01 | 60
Category1 | 2019-04-01 | 45
Category1 | 2019-05-01 | 29
Category2 | 2019-03-01 | 78
Category2 | 2019-04-01 | 95
Category2 | 2019-05-01 | 98

Но я бы хотел, чтобы у моего результата были все месяцы от @StartDate до @EndDate для каждого из Categories с процентным значением, равным нулю, если для этой категории данных не существует.

Category  | MonthYear  | Percentage
----------+------------+------------    
Category1 | 2018-12-01 | 80 
Category1 | 2019-01-01 | 70
Category1 | 2019-02-01 | 75
Category1 | 2019-03-01 | 60
Category1 | 2019-04-01 | 45
Category1 | 2019-05-01 | 29
Category2 | 2018-12-01 | 0
Category2 | 2019-01-01 | 0
Category2 | 2019-02-01 | 0
Category2 | 2019-03-01 | 78
Category2 | 2019-04-01 | 95
Category2 | 2019-05-01 | 98

1 Ответ

2 голосов
/ 23 мая 2019

Вы можете использовать рекурсивный CTE для генерации дат.Затем используйте cross join и left join для ввода данных.Итак:

with dates as (
      select min(monthyear) as yyyymm, max(monthyear) as max_yyyymm
      from t
      union all
      select dateadd(month, 1, yyyymm), max_yyyymm
      from dates
      where yyyymm < max_yyyymm
    )
select c.category, d.yyyymm, coalesce(t.percentage, 0) as percentage
from (select distinct category from t) c cross join
     dates d left join
     t
     on t.category = c.category and t.monthyear = d.yyyymm
order by c.category, d.yyyymm;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...