Sql server TSQL Sum使用group by聚合多个列

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中有多行时

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