Sql server TSQL Sum使用group by聚合多个列
Hi有三个表作为一个更大查询的一部分,我正在尝试为计算聚合一些值,但由于总和聚合是在group by发生之前对所有行进行合计,因此结果会加倍 表: SR01 AC95 AC96 注意本例中的两行 质疑 结果 请注意,PrepTim、TravelTime和VisitTime的值未聚合且显示正确。当使用总和相加时,总数是11而不是5.5的预期值的两倍 考虑到这可能是由于AC96中有多行,我删除了Group By,显示了两行。这就是为什么总和aggreagte是该值的两倍 问题: 当AC96中有多行时,如何正确地定义查询以正确地求和,而不使数值加倍或更多?请尝试此操作Sql server TSQL Sum使用group by聚合多个列,sql-server,sql-server-2008,tsql,aggregate,Sql Server,Sql Server 2008,Tsql,Aggregate,Hi有三个表作为一个更大查询的一部分,我正在尝试为计算聚合一些值,但由于总和聚合是在group by发生之前对所有行进行合计,因此结果会加倍 表: SR01 AC95 AC96 注意本例中的两行 质疑 结果 请注意,PrepTim、TravelTime和VisitTime的值未聚合且显示正确。当使用总和相加时,总数是11而不是5.5的预期值的两倍 考虑到这可能是由于AC96中有多行,我删除了Group By,显示了两行。这就是为什么总和aggreagte是该值的两倍 问题: 当AC96中有多行时
;WITH cte_PreResult AS
(
SELECT DISTINCT 'Month' AS [Period],
ISNULL(Zone.ZoneID,'') AS ZoneID,
ISNULL(Zone.ZoneName,'') AS ZoneName,
ISNULL(Region.RegionCode,'') AS RegionCode,
ISNULL(Region.RegionName,'') AS RegionName,
Branch.BranchID,
ISNULL(Branch.BranchName,'') AS BranchName,
SR01.ServicingRep,
ISNULL(LCRep.RepName,'') AS RepName,
AC95.PrepTime,
AC95.SvcPrepTime,
AC95.TravelTime,
AC95.SvcTravelTime,
AC95.VisitTime,
AC95.SvcVisitTime,
SR01.ReportKEy
FROM dbo.SR01
INNER JOIN AC95
ON AC95.ReportKey = SR01.ReportKey
INNER JOIN AC96
ON AC96.ReportKey = AC95.ReportKey
LEFT JOIN dbo.RequestsNonReportView
ON RequestsNonReportView.ReportKey = SR01.ReportKey
LEFT JOIN dbo.LCRep
ON SR01.ServicingRep = LCRep.RepID
LEFT JOIN dbo.Branch
ON SR01.ServicingBranch = Branch.BranchID
LEFT JOIN dbo.Region
ON Region.RegionCode = Branch.Region
LEFT JOIN dbo.Zone
ON Zone.ZoneAbbrev = Region.Zone
WHERE ISNULL(SR01.ServicingBranch,'-') <> '-'
AND SR01.[Status]='X'
AND SR01.RequestType <> 'MN'
AND SR01.DateComplete BETWEEN DATEADD(month, DATEDIFF(month, 0, @DateTo), 0) AND @DateTo
AND (AC95.OnOffSite = 'ON' OR AC95.OnOffSiteSvc = 'ON')
AND SR01.ServicingRep = @ServicingRep
)
SELECT [Period],
ZoneID,
ZoneName,
RegionCode,
RegionName,
BranchID,
BranchName,
ServicingRep,
RepName,
SUM(AC95.PrepTime + AC95.SvcPrepTime + AC95.TravelTime + AC95.SvcTravelTime + AC95.VisitTime + AC95.SvcVisitTime) AS HoursMonth,
ReportKey
FROM cte_PreResult
GROUP BY [Period],
ZoneID,
ZoneName,
RegionCode,
RegionName,
BranchID,
BranchName,
ServicingRep,
RepName,
ReportKey
虽然这样做是可行的,但我希望在主查询体中这样做,因为这是从更大的查询中提取的。这是可能的。只需将AC95.PrepTime+AC95.SvcPrepTime+AC95.TravelTime+AC95.SvcTravelTime+AC95.VisitTime+AC95.VisitTime添加为小时月,
select * from ac95 where ReportKey = 109626
select * from ac96 where ReportKey = 109626
SELECT 'Month' AS [Period],
ISNULL(Zone.ZoneID,'') AS ZoneID,
ISNULL(Zone.ZoneName,'') AS ZoneName,
ISNULL(Region.RegionCode,'') AS RegionCode,
ISNULL(Region.RegionName,'') AS RegionName,
Branch.BranchID,
ISNULL(Branch.BranchName,'') AS BranchName,
SR01.ServicingRep,
ISNULL(LCRep.RepName,'') AS RepName,
AC95.PrepTime, AC95.SvcPrepTime , AC95.TravelTime , AC95.SvcTravelTime , AC95.VisitTime , AC95.SvcVisitTime,
SUM(AC95.PrepTime + AC95.SvcPrepTime + AC95.TravelTime + AC95.SvcTravelTime + AC95.VisitTime + AC95.SvcVisitTime) AS HoursMonth,
SR01.ReportKEy
FROM dbo.SR01
INNER JOIN AC95 ON AC95.ReportKey = SR01.ReportKey
INNER JOIN AC96 ON AC96.ReportKey = AC95.ReportKey
LEFT JOIN dbo.RequestsNonReportView ON RequestsNonReportView.ReportKey = SR01.ReportKey
LEFT JOIN dbo.LCRep ON SR01.ServicingRep = LCRep.RepID
LEFT JOIN dbo.Branch ON SR01.ServicingBranch = Branch.BranchID
LEFT JOIN dbo.Region ON Region.RegionCode = Branch.Region
LEFT JOIN dbo.Zone ON Zone.ZoneAbbrev = Region.Zone
WHERE ISNULL(SR01.ServicingBranch,'-') <> '-'
AND SR01.[Status]='X'
AND SR01.RequestType <> 'MN'
AND SR01.DateComplete BETWEEN DATEADD(month, DATEDIFF(month, 0, @DateTo), 0) AND @DateTo
AND (AC95.OnOffSite = 'ON' OR AC95.OnOffSiteSvc = 'ON')
AND SR01.ServicingRep = @ServicingRep
GROUP BY Zone.ZoneID, Zone.ZoneName, Region.RegionCode, Region.RegionName, Branch.BranchID, BranchName, SR01.ServicingRep, LCRep.RepName, SR01.ReportKEy,AC95.PrepTime,AC95.SvcPrepTime , AC95.TravelTime , AC95.SvcTravelTime , AC95.VisitTime , AC95.SvcVisitTime
;WITH cte_PreResult AS
(
SELECT DISTINCT 'Month' AS [Period],
ISNULL(Zone.ZoneID,'') AS ZoneID,
ISNULL(Zone.ZoneName,'') AS ZoneName,
ISNULL(Region.RegionCode,'') AS RegionCode,
ISNULL(Region.RegionName,'') AS RegionName,
Branch.BranchID,
ISNULL(Branch.BranchName,'') AS BranchName,
SR01.ServicingRep,
ISNULL(LCRep.RepName,'') AS RepName,
AC95.PrepTime,
AC95.SvcPrepTime,
AC95.TravelTime,
AC95.SvcTravelTime,
AC95.VisitTime,
AC95.SvcVisitTime,
SR01.ReportKEy
FROM dbo.SR01
INNER JOIN AC95
ON AC95.ReportKey = SR01.ReportKey
INNER JOIN AC96
ON AC96.ReportKey = AC95.ReportKey
LEFT JOIN dbo.RequestsNonReportView
ON RequestsNonReportView.ReportKey = SR01.ReportKey
LEFT JOIN dbo.LCRep
ON SR01.ServicingRep = LCRep.RepID
LEFT JOIN dbo.Branch
ON SR01.ServicingBranch = Branch.BranchID
LEFT JOIN dbo.Region
ON Region.RegionCode = Branch.Region
LEFT JOIN dbo.Zone
ON Zone.ZoneAbbrev = Region.Zone
WHERE ISNULL(SR01.ServicingBranch,'-') <> '-'
AND SR01.[Status]='X'
AND SR01.RequestType <> 'MN'
AND SR01.DateComplete BETWEEN DATEADD(month, DATEDIFF(month, 0, @DateTo), 0) AND @DateTo
AND (AC95.OnOffSite = 'ON' OR AC95.OnOffSiteSvc = 'ON')
AND SR01.ServicingRep = @ServicingRep
)
SELECT [Period],
ZoneID,
ZoneName,
RegionCode,
RegionName,
BranchID,
BranchName,
ServicingRep,
RepName,
SUM(AC95.PrepTime + AC95.SvcPrepTime + AC95.TravelTime + AC95.SvcTravelTime + AC95.VisitTime + AC95.SvcVisitTime) AS HoursMonth,
ReportKey
FROM cte_PreResult
GROUP BY [Period],
ZoneID,
ZoneName,
RegionCode,
RegionName,
BranchID,
BranchName,
ServicingRep,
RepName,
ReportKey