SQL查询 - 拆分行

时间:2016-02-12 23:20:03

标签: sql sql-server

对于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 个答案:

答案 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