ms sql : 向表中插入所缺的行

浏览: 1230

前两天公司同事需求,根据日期向表中插入欠缺的日期,其他字段内容取前一个日期行的内容,其中一个字段设置为0

ifobject_id('test','U') IS NOT NULL

DROPTABLE test


createtable test

([date]varchar(200),

categoryvarchar(200),

ytd int,

mtd int)

 

insertinto test

SELECT *

FROM(values('201505','A',1,1),

                      ('201509','A',1,1),

                      ('201503','B',1,1),

              ('201504','B',1,1),

              ('201508','B',1,1)

  )ASA([DATE],CATEGORY,YTD,MTD)

Clipboard Image.png

一种方式:利用循环

DECLARE@MIN_DATE VARCHAR(6)

SELECT@MIN_DATE=CAST(MIN(RIGHT([DATE],2)) AS INT) FROM TEST

WHILE(@MIN_DATE<=12)

BEGIN

INSERTINTO test

SELECTCAST(B.date AS INT)+1,

              B.category,

   B.YTD,

   0

FROM TEST

RIGHTJOIN (SELECT *,

                                    LEFT([DATE],4) AS [YEAR],

                                    CAST(RIGHT([DATE],2) ASINT)+1 AS [MONTH]

                       FROMTEST) B

ONLEFT(TEST.[date],4)=B.[YEAR]

ANDCAST(RIGHT(TEST.[date],2) AS INT)=B.[MONTH]

ANDTEST.category=B.category

WHERETEST.category IS NULL

SET@MIN_DATE=@MIN_DATE+1

DELETETEST WHERE RIGHT(date,2)>12

END


select *

from test

order by category,

               [date]

Clipboard Image.png


第二种方法:

declare @mindate varchar(6),@maxdate varchar(6)

select @mindate=min([date])from test

select @maxdate=max([date])from test

;

with dt([date]) as

    (select @mindate

     union all

     select convert(varchar(6),cast(dt.[date] as int)+1) as [date]

     from dt

     where convert(varchar(6),cast(dt.[date] as int)+1) <=@maxdate

    )

,

category as

(select * 

 from dt 

 cross join (select distinct

                    category 

             from test) as a

)

,

cte as

(select category.[date],

        category.category,

isnull(test.ytd,0) as ytd,

isnull(test.mtd,0) as mtd

from test 

right join category

on test.[date]=category.[date]

and test.category=category.category

)

select cte.[date],

       cte.category,

  isnull((select max(ytd) from cte as c where c.category=cte.category and c.[date]<=cte.[date]),0) as ytd,

  cte.mtd

from cte

order by cte.category,

cte.[date]

Clipboard Image.png

推荐 0
本文由 hmily1023 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册