【问题标题】:SQL How to Update SUM of column over group in same tableSQL如何更新同一表中组上列的总和
【发布时间】:2014-03-19 05:40:15
【问题描述】:

我有一个类似于以下的 (SQL Server) 表:

销售总结

年份 |团队 |人 |销售人员 |团队销售/年

2013      1          Jim             10 美元                 ??

2013      1         安娜                                                                                                                                                                           ?

2013      2         约翰            8 美元                 ??

2013      3        托德             4 美元                 ??

2013      3        艾伦             1 美元                 ??

2014      3        艾伦              22 美元                 ??

我正在尝试总结这个示例 SalesSummary 表并将正确的值插入到 Team Sales 列中。在此示例中,我希望第一列和第二列 10 美元,第三列 8 美元,第 4/5 列 5 美元和第 6 列插槽 22 美元。原谅我对 SQL 的无知,但我认为这是一个糟糕的解决方案,如下所示:

UPDATE SalesSummary SET TeamSales = sum.TeamSales
FROM (SELECT Team, Year, SUM(PersonSales) OVER (Partition By Team, Year) as TeamSales)
      FROM SalesSummary
      GROUP BY Team, Year, PersonSales
     ) AS sum, SalesSummary as SS
WHERE sum.Team = ss.Team AND sum.Year = ss.Year

我希望有人能够展示如何最好地执行此类更新。我感谢任何帮助、提示或示例。如果这很明显,请道歉。

【问题讨论】:

  • 您使用的是什么数据库? SQL Server 还是 MySQL?
  • SQL 服务器。为小姐道歉。
  • 顺便说一句,创建这样的列是完全没有必要的。如果您始终可以使用您提供的 SQL 语法计算值,为什么还需要此列?

标签: sql sql-server optimization


【解决方案1】:

我有一个表变量而不是常规表,因此我需要稍微调整@Shell 的answer - 所以当表是变量时我的问题问题的解决方案:

Update SU
Set TeamSales = (Select Sum(SI.PersonSales) 
                 From   @SalesSummary SI 
                 Where  SI.Year=SU.Year AND SI.Team=SU.Team)
From @SalesSummary SU

【讨论】:

    【解决方案2】:

    假设您使用的是 SQL Server,我认为您想要这样的东西:

    WITH toupdate AS
         (SELECT team, year, 
                 Sum(personsales) OVER (partition BY team, year) AS newTeamSales 
          FROM salessummary
         ) 
    UPDATE toupdate 
       SET teamsales = newteamsales; 
    

    您的原始查询存在多个问题和可疑结构。首先,聚合子查询不可更新。其次,您正在进行聚合并使用窗口函数,尽管允许,但这是不寻常的。第三,您通过PersonSales 进行聚合并使用sum()。再一次,允许,但不寻常。

    【讨论】:

      【解决方案3】:

      试试这个。

      UPDATE  SalesSummary SET TeamSales = (Select Sum(PersonSales) 
              From    SalesSummary S 
              Where S.Year=SalesSummary.Year AND S.Team=SalesSummary.Team)
      

      【讨论】:

      • 这对我有帮助。非常感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 2018-12-10
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多