【问题标题】:SQL - Get the sum of several groups of recordsSQL - 获取几组记录的总和
【发布时间】:2021-06-15 19:55:04
【问题描述】:

期望的结果

获取所有 [Hours] 的小时总和,包括每个 [DevelopmentID] 的单个结果,其中 [Revision] 是最高值

例如 SUM 1、2、3、5、6(结果应该是 22.00)

我一直在尝试进行适当的分组。

DECLARE @CompanyID INT = 1

SELECT  
  SUM([s].[Hours]) AS [Hours]
FROM
  [dbo].[tblDev] [d] WITH (NOLOCK)
JOIN
  [dbo].[tblSpec] [s] WITH (NOLOCK) ON [d].[DevID] = [s].[DevID]
WHERE   
  [s].[Revision] = (
    SELECT MAX([s2].[Revision]) FROM [tblSpec] [s2]
  )
GROUP BY
  [s].[Hours]

【问题讨论】:

  • SUM([s].[Hours])GROUP BY [s].[Hours] 发生冲突。您通常 GROUP BY 与您选择的列相同,除了那些作为设置函数的参数的列。
  • 停止使用nolock 溅出你的代码

标签: sql sql-server sum sql-max


【解决方案1】:

使用row_number() 标识最新版本

SELECT SUM([Hours])
FROM   (
           SELECT *, R = ROW_NUMBER() OVER (PARTITION BY d.DevID
                                                ORDER BY s.Revision)
           FROM   [dbo].[tblDev] d
           JOIN   [dbo].[tblSpec] s 
             ON   d.[DevID] = s.[DevID]
       ) d
WHERE  R = 1 

【讨论】:

  • 正是我需要的。感谢您在没有免费侮辱的情况下提供帮助。
【解决方案2】:

如果您希望每个 DevId 有一行,那么应该在 GROUP BY 中(并且大概在 SELECT 中):

SELECT s.DevId, SUM(s.Hours) as hours
FROM [dbo].[tblDev] d JOIN
     [dbo].[tblSpec] s
     ON [d].[DevID] = [s].[DevID]
WHERE s.Revision = (SELECT MAX(s2.Revision) FROM tblSpec s2)
GROUP BY s.DevId;

另外,除非你真的知道自己在做什么,否则不要使用WITH NOLOCK——我猜你不知道。它基本上是一个许可证,上面写着:“即使数据不是 100% 准确,您也可以获取我的数据。”

我也会省去所有的方括号。它们只是使查询更难编写和阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多