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
答
按照下面的脚本并得到结果
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
你确定SQL是适合你的工具? – SabDeM
一个解决方案是使用' ='来为它建立一个'日期'表和'连接'。你也可以用“数字”表做同样的事情,但需要多一点工作。 – sgeddes
不,我不确定SQL是否是正确的工具,是否有更适合于此的工具? – user5920829