[英]SQL Server query to get the data from previous month if the column value is not present in next month
我有一張桌子,其中包含每個月餐廳的許多菜單項。 並且只要項目數量發生變化,表格就會更新。
我想更改表或制作一個新表以獲取每個月的項目值。
例如。 如果最近一個月是四月
餐廳 | 項目數 | 月 |
---|---|---|
一個 | 20 | 2021 年 1 月 1 日 |
一個 | 15 | 2021 年 1 月 21 日 |
乙 | 12 | 2021 年 1 月 1 日 |
C | 30 | 2021 年 2 月 1 日 |
一個 | 22 | 2021 年 3 月 31 日 |
乙 | 15 | 2021 年 4 月 1 日 |
我希望新表具有上述行加上與上個月具有相同數據的缺失月份
餐廳 | 項目數 | 月 |
---|---|---|
一個 | 20 | 2021 年 1 月 1 日 |
一個 | 15 | 2021 年 1 月 21 日 |
一個 | 15 | 2021 年 2 月 21 日 |
一個 | 22 | 2021 年 3 月 1 日 |
一個 | 22 | 2021 年 4 月 1 日 |
乙 | 12 | 2021 年 1 月 1 日 |
乙 | 12 | 2021 年 2 月 1 日 |
乙 | 12 | 2021 年 3 月 1 日 |
乙 | 15 | 2021 年 4 月 1 日 |
C | 30 | 2021 年 2 月 1 日 |
C | 30 | 2021 年 3 月 31 日 |
C | 30 | 2021 年 4 月 1 日 |
感謝幫助家伙贊賞
這回答了問題的原始版本。
假設該month
存儲為該月的第一天的日期,那么一個簡單的方法使用遞歸 CTE:
with cte as (
select restaurant, num_items, month,
dateadd(month, -1,
coalesce(lead(month) over (partition by restaurant order by month),
max(month) over ()
)
) as end_month
from t
union all
select restaurant, num_items, dateadd(month, 1, month), end_month
from cte
where month < end_month
)
select *
from cte
order by restaurant, month;
這是一個 db<>fiddle。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.