SQL - 获取几组记录的总和
SQL - Get the sum of several groups of records
期望的结果
获取所有 [Hours] 的小时总和,仅包括来自每个 [DevelopmentID] 的单个结果,其中 [修订] 是最高值
例如 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]
如果你想要每个 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% 准确,你也可以得到我的数据。”
我也会放弃所有的方括号。它们只会让查询更难编写和阅读。
使用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
期望的结果
获取所有 [Hours] 的小时总和,仅包括来自每个 [DevelopmentID] 的单个结果,其中 [修订] 是最高值
例如 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]
如果你想要每个 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% 准确,你也可以得到我的数据。”
我也会放弃所有的方括号。它们只会让查询更难编写和阅读。
使用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