Sql 复制上月值并插入新行

Sql 复制上月值并插入新行,sql,copy,reporting,datepart,Sql,Copy,Reporting,Datepart,以下是我拥有的当前表格的一个示例: 1) 表名:TotalSales Name Year Month Sales ------ ---- ----- ----- Alfred 2011 1 100 Name Year Month Sales Prior month sales ------ ---- ----- ----- ----------------- Alfred 2011 2 110 100 我要做的是创建这样一

以下是我拥有的当前表格的一个示例:

1) 表名:TotalSales

Name    Year  Month  Sales
------  ----  -----  -----
Alfred  2011  1      100
Name    Year  Month  Sales  Prior month sales
------  ----  -----  -----  -----------------
Alfred  2011  2      110    100
我要做的是创建这样一个表,添加一个新行(上月销售额):

2) 表名:TotalSales

Name    Year  Month  Sales
------  ----  -----  -----
Alfred  2011  1      100
Name    Year  Month  Sales  Prior month sales
------  ----  -----  -----  -----------------
Alfred  2011  2      110    100
不知道该怎么做,但这是我一直在做的:

SELECT Name, Year, Month, Sales, Sales as [Prior Month sales]
FROM TotalSales
WHERE
DATEPART(month, [Prior Month sales]) = DATEPART(month, DATEADD(month, -1, getdate()))

感谢您的帮助

我相信这应该会起作用……您需要在name/previor month上加入自己,但是您有两个上个月的测试用例,因为year/month是单独存储的

select c.Name, c.Year, c.Month, c.Sales, p.Sales
from TotalSales c
left join TotalSales p
on c.Name = p.Name and (
    (c.Month > 1 and c.Year = p.Year and c.Month = p.Month + 1)
    or (c.Month = 1 and c.Year = p.Year + 1 and p.Month = 12))

要选择给定数据,需要将表连接到自身:

SELECT
    TS.name,
    TS.year,
    TS.month,
    TS.sales,
    COALESCE(TS2.sales, 0) AS prior_month_sales
FROM
    TotalSales TS
LEFT OUTER JOIN TotalSales TS2 ON
    TS2.name = TS.name AND
    (
        (TS2.year = TS.year AND TS2.month = TS.month - 1) OR
        (TS.month = 1 AND TS2.month = 12 AND TS2.year = TS.year - 1)
    )

左侧外部联接
是一个外部联接,以防他们在上个月(或这是他们在公司的第一个月)没有任何销售。

尝试类似的操作,仅使用您想要的值更新表

UPDATE TotalSales
SET PriorMonthSales = 
(
    SELECT TS.Sales
    FROM TotalSales TS
    WHERE 
    (TotalSales.Month = TS.Month + 1 AND TotalSales.Year = TS.Year)
    OR 
    (TotalSales.Month = 1 AND TS.Month = 12 AND TS.Year = TotalSales.Year -1)
)

您想要创建一个表,还是想要能够选择数据?我非常反对创建一个新表。这将导致数据库中的数据重复,甚至在同一个表中,这违反了数据库设计的基本规则之一。这样做有很多陷阱。同意-你可以把我发布的查询去掉,创建一个视图,这样数据总是可用的只是我最后一条评论的快速补充。。。由于该表本身看起来像一个报告表,希望只能通过批处理进行更新以用于报告目的,因此如果您将数据也放入另一个表中,这可能不是什么大问题。您好,谢谢您的回答,我们现在将尝试这些答案。请记住,如果您尝试将这些数据保留在单独的行中(而不是像Derek建议的那样使用视图)那么,如果有人现在更新原始行,它将不会反映在您的新月份数据中。它将不同步。这些同步问题总是会引起很多麻烦,这就是为什么在普通数据库中保留重复数据通常是个坏主意。