SQL 如果列值在下个月不存在,则服务器查询以获取上个月的数据
SQL Server query to get the data from previous month if the column value is not present in next month
我有一个 table,其中包含餐厅每个月的一些菜单项。
只要项目数量发生变化,table 就会更新。
我想更改 table 或创建一个新的 table 以获取每个月的项目价值。
例如。
如果最近的月份是四月
餐厅
项目数
月份
一个
20
1/1/2021
一个
15
1/21/2021
B
12
1/1/2021
C
30
2021 年 2 月 1 日
一个
22
2021 年 3 月 31 日
B
15
2021 年 4 月 1 日
我希望新的 table 具有以上行以及与上个月相同数据的缺失月份
餐厅
项目数
月份
一个
20
1/1/2021
一个
15
1/21/2021
一个
15
2021 年 2 月 21 日
一个
22
2021 年 3 月 1 日
一个
22
2021 年 4 月 1 日
B
12
1/1/2021
B
12
2021 年 2 月 1 日
B
12
2021 年 3 月 1 日
B
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;
Here 是一个 db<>fiddle.
我有一个 table,其中包含餐厅每个月的一些菜单项。 只要项目数量发生变化,table 就会更新。
我想更改 table 或创建一个新的 table 以获取每个月的项目价值。
例如。 如果最近的月份是四月
餐厅 | 项目数 | 月份 |
---|---|---|
一个 | 20 | 1/1/2021 |
一个 | 15 | 1/21/2021 |
B | 12 | 1/1/2021 |
C | 30 | 2021 年 2 月 1 日 |
一个 | 22 | 2021 年 3 月 31 日 |
B | 15 | 2021 年 4 月 1 日 |
我希望新的 table 具有以上行以及与上个月相同数据的缺失月份
餐厅 | 项目数 | 月份 |
---|---|---|
一个 | 20 | 1/1/2021 |
一个 | 15 | 1/21/2021 |
一个 | 15 | 2021 年 2 月 21 日 |
一个 | 22 | 2021 年 3 月 1 日 |
一个 | 22 | 2021 年 4 月 1 日 |
B | 12 | 1/1/2021 |
B | 12 | 2021 年 2 月 1 日 |
B | 12 | 2021 年 3 月 1 日 |
B | 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;
Here 是一个 db<>fiddle.