2016-02-12 70 views
1

我是一個新手,當涉及到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

一個解決方案是使用'<=' and '> ='來爲它建立一個'日期'表和'連接'。你也可以用「數字」表做同樣的事情,但需要多一點工作。 – sgeddes

+1

不,我不確定SQL是否是正確的工具,是否有更適合於此的工具? – user5920829

回答

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