对于SQL查询我是一个新手,但是我有一个问题需要解决,但尚未找到解决方案。
我有一个包含合同的数据库,基本上看起来像下面的行。这意味着我们同意以每年12月至3月的固定价格出售商品,为期三个冬季,共12个月。
ID Type From To Period Units
1 VS 2016-12-01 2019-03-01 dec-mar 125000
我想写一个查询,以便得到一个类似下面的表,我每个月得到一行,单位数和一行的月份。这可行吗?如果是这样,查询会是什么样的?
Br
CS
ID Type From To Period Units Month
1 VS 2016-12-01 2019-03-01 dec-mar 125000 2016-12-01
1 VS 2016-12-01 2019-03-01 dec-mar 125000 2017-01-01
1 VS 2016-12-01 2019-03-01 dec-mar 125000 2017-02-01
1 VS 2016-12-01 2019-03-01 dec-mar 125000 2017-03-01
1 VS 2016-12-01 2019-03-01 dec-mar 125000 2017-12-01
1 VS 2016-12-01 2019-03-01 dec-mar 125000 2018-01-01
1 VS 2016-12-01 2019-03-01 dec-mar 125000 2018-02-01
1 VS 2016-12-01 2019-03-01 dec-mar 125000 2018-03-01
1 VS 2016-12-01 2019-03-01 dec-mar 125000 2018-12-01
1 VS 2016-12-01 2019-03-01 dec-mar 125000 2019-01-01
1 VS 2016-12-01 2019-03-01 dec-mar 125000 2019-02-01
1 VS 2016-12-01 2019-03-01 dec-mar 125000 2019-03-01
答案 0 :(得分:0)
按照以下脚本获取结果
declare @startDt date = '2016-12-01'
declare @endDt date = '2019-03-01'
declare @info table (id int, [type] varchar(5), [From] date, [To] date, Period varchar(10), units int)
insert into @info values (1, 'VS', @startDt, @endDt, 'dec-mar', 125000)
declare @dates table (dt date)
declare @mnts int = datediff(MONTH, @startDt, @endDt)
declare @i int = 0
while @i <= @mnts
begin
declare @d1 date = dateadd(MONTH, @i, @startDt)
if MONTH(@d1) >= MONTH(@startDt) or MONTH(@d1) <= MONTH(@endDt)
insert into @dates values (@d1)
set @i = @i + 1
end
select *
from @info cross join @dates
order by dt