簡體   English   中英

TSQL-在開始日期和結束日期之間的每個月的返回記錄,即使該月沒有可用數據

[英]TSQL - Return Records for each of the Months between Start and End Dates even if no data available for that month

我當前的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

但是我希望我的結果是每個Categories @StartDate@EndDate之間的所有月份的百分比值為零(如果該類別沒有數據)。

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

您可以使用遞歸CTE生成日期。 然后使用cross joinleft 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM