首页 > 解决方案 > 将数据从表中的行复制到同一表中的未来行

问题描述

我有一个以日期为主键的 Temp 表 - 每天一行,大约 2 年的行。我想将 2017 年 8 月 1 日的 CY 实际交易量复制到 2017 年 9 月 1 日,依此类推(尽管我希望能够运行此 SQL 来复制其他数据也)。

所以 2017 年 9 月 1 日应该有 200 个,以此类推整个月。

Date,  Pipeline,  CY Actual Volume

8/1/2017,      XX,         200

8/2/2017,      YY,        100

.....


9/1/2017,      XX,          0

9/2/2017,  YY,     0
.
.

我有以下 SQL,但它不起作用(它确实运行成功并给了我受影响的行数,但没有任何变化)。

update cy
set cy.[CY Actual Volume] = ny.[CY Actual Volume]
from [dbo].[Temp] cy 
left join [dbo].[Temp] ny on dateadd(day, 31, cy.Date) = ny.Date
                          and cy.[Pipeline] = ny.[Pipeline] 
where cy.[CY Actual Volume] = 0 
  and year(ny.Date) = 2017

标签: sqlsql-server

解决方案


CREATE TABLE Volume
(
    Date date not null primary key,
    Pipeline nvarchar(50) not null,
    CY int not null
)

go

--delete Volume;

insert into Volume
    (Date, Pipeline, CY)
VALUES
    ('2017-08-01', 'XX', 200),
    ('2017-08-02', 'YY', 100),
    ('2017-09-01', 'XX', 0),
    ('2017-09-02', 'YY', 0);

update v1
set
    v1.CY = v2.CY
output inserted.Date, inserted.Pipeline, deleted.CY as OldCY, inserted.CY as NewCY 
from
    Volume as v1 inner join Volume as v2
        on (DATEADD(MONTH, -1, v1.Date) = v2.Date and MONTH(v2.Date) = 8 and YEAR(v2.Date) = 2017)

推荐阅读