SQL查询 - 分割行

问题描述:

我是一个新手,当涉及到SQL查询,但有一个问题,我需要解决但尚未找到解决方案。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 
+1

你确定SQL是适合你的工具? – SabDeM

+1

一个解决方案是使用' ='来为它建立一个'日期'表和'连接'。你也可以用“数字”表做同样的事情,但需要多一点工作。 – sgeddes

+1

不,我不确定SQL是否是正确的工具,是否有更适合于此的工具? – user5920829

按照下面的脚本并得到结果

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