【问题标题】:Copy prior month value and insert into new row复制上个月的值并插入新行
【发布时间】:2011-07-29 13:35:15
【问题描述】:

这是我当前的表的示例:

1) 表名:TotalSales

Name    Year  Month  Sales
------  ----  -----  -----
Alfred  2011  1      100

我要做的是创建一个这样的表,添加一个新行(上个月销售额):

2) 表名:TotalSales

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()))

感谢您的帮助

【问题讨论】:

  • 您想创建一个表还是希望能够选择数据?我非常建议不要创建一个新表。即使在同一个表中,它也会导致数据库中的数据重复,这违反了数据库设计的基本规则之一。这样做有很多陷阱。
  • 同意 - 您可以获取我发布的查询并创建一个视图,以便数据始终可用
  • 只是对我上一条评论的快速补充......因为表格本身看起来像一个报告表,希望只能通过批处理更新以用于报告目的,如果您这样做可能没什么大不了的然后将数据也放入另一个表中。
  • 您好,感谢您的回答,现在就尝试一下。
  • 请记住,如果您尝试将这些数据保存在单独的行中(而不是像 Derek 建议的那样使用视图),那么如果有人现在更新原始行,它将不会反映在您的新月份数据。它将不同步。这些同步问题总是让人头疼,这就是为什么将重复数据保存在普通数据库中通常是个坏主意。

标签: sql copy reporting datepart


【解决方案1】:

我相信这应该可行...您需要在名称/上个月加入自身,但您有前一个月的 2 个测试用例,因为年/月是分开存储的。

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))

【讨论】:

    【解决方案2】:

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

    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)
        )
    

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

    【讨论】:

      【解决方案3】:

      尝试这样的操作,只用你想要的值更新表格......

      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)
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-23
        • 2015-10-01
        • 1970-01-01
        • 2020-01-24
        • 1970-01-01
        • 1970-01-01
        • 2013-05-15
        • 1970-01-01
        相关资源
        最近更新 更多