TSQL Group By & Count 未按预期聚合

TSQL Group By & Count not aggregating as expected

我有一个 returns 6 行的查询,我想聚合信息以提供包含实例计数的单行。没有聚合查询 returns 正确的数据但是当我向查询添加 GroupBy 和 Count 时它 returns 2 行。

第一个结果中显示的基础 ID (SR01.ReportKey) 有两条记录,因此我认为分组依据以某种方式在分组中使用了该字段。

注意:ReportKey 实际上并没有用在查询中,我只是在第一个结果中使用它以供参考。

问题:

知道为什么分组依据没有将所有行分组为计数为 6 的单个结果吗?

无聚合

查询:

SELECT 
    'Open' AS RecStatus,
    ISNULL(UWZone.UWZoneID,'') AS ZoneID,
    ISNULL(UWZone.UWZoneName,'') AS ZoneName,
    Branch.BranchID,
    ISNULL(Branch.BranchName,'') AS BranchName,
    UW.UWID AS ServicingRep,
    ISNULL(UW.UWName,'') + '/' + ISNULL(UA.UWName, '') AS RepName
    FROM ProductivityRecommendations
        INNER JOIN SR01 ON SR01.ReportKey = ProductivityRecommendations.ReportKey
        LEFT JOIN UW ON SR01.Underwriter = UW.UWID
        LEFT JOIN UW AS UA ON SR01.UA = UA.UWID
        LEFT JOIN Branch ON SR01.ProdBranch = Branch.BranchID
        LEFT JOIN UWZone ON UWZone.UWZoneAbbrev = Branch.UWZone 
    WHERE ISNULL(SR01.ServicingBranch,'-') <> '-'
        AND ProductivityRecommendations.DateComplete BETWEEN @DateFrom AND @DateTo
        AND ProductivityRecommendations.RecCriticality IN ('CRI', 'CCM')
        AND ProductivityRecommendations.RecStatus IN ('N','O','U','A','R')
        AND DateRecIssued IS NOT NULL
        AND (@Zone IS NULL OR (UWZone.UWZoneID IN (SELECT val FROM ufn_SplitMax(@Zone ,','))))
        AND (@Branch IS NULL OR (Branch.BranchID IN (SELECT val FROM ufn_SplitMax(@Branch ,','))))
        AND (@RepID IS NULL OR (SR01.Underwriter IN(SELECT val FROM ufn_SplitMax(@RepID ,','))) OR @RepID IS NULL OR (SR01.UA IN(SELECT val FROM ufn_SplitMax(@RepID ,','))))
        AND (@InsuredNumber IS NULL OR (ProductivityRecommendations.CustNum IN (SELECT val FROM ufn_SplitMax(@InsuredNumber ,','))))

结果:

添加聚合

查询:

SELECT 
    'Open' AS RecStatus,
    ISNULL(UWZone.UWZoneID,'') AS ZoneID,
    ISNULL(UWZone.UWZoneName,'') AS ZoneName,
    Branch.BranchID,
    ISNULL(Branch.BranchName,'') AS BranchName,
    UW.UWID AS ServicingRep,
    ISNULL(UW.UWName,'') + '/' + ISNULL(UA.UWName, '') AS RepName,
    COUNT(ProductivityRecommendations.RecStatus) AS Requests
    FROM ProductivityRecommendations
        INNER JOIN SR01 ON SR01.ReportKey = ProductivityRecommendations.ReportKey
        LEFT JOIN UW ON SR01.Underwriter = UW.UWID
        LEFT JOIN UW AS UA ON SR01.UA = UA.UWID
        LEFT JOIN Branch ON SR01.ProdBranch = Branch.BranchID
        LEFT JOIN UWZone ON UWZone.UWZoneAbbrev = Branch.UWZone 
    WHERE ISNULL(SR01.ServicingBranch,'-') <> '-'
        AND ProductivityRecommendations.DateComplete BETWEEN @DateFrom AND @DateTo
        AND ProductivityRecommendations.RecCriticality IN ('CRI', 'CCM')
        AND ProductivityRecommendations.RecStatus IN ('N','O','U','A','R')
        AND DateRecIssued IS NOT NULL
        AND (@Zone IS NULL OR (UWZone.UWZoneID IN (SELECT val FROM ufn_SplitMax(@Zone ,','))))
        AND (@Branch IS NULL OR (Branch.BranchID IN (SELECT val FROM ufn_SplitMax(@Branch ,','))))
        AND (@RepID IS NULL OR (SR01.Underwriter IN(SELECT val FROM ufn_SplitMax(@RepID ,','))) OR @RepID IS NULL OR (SR01.UA IN(SELECT val FROM ufn_SplitMax(@RepID ,','))))
        AND (@InsuredNumber IS NULL OR (ProductivityRecommendations.CustNum IN (SELECT val FROM ufn_SplitMax(@InsuredNumber ,','))))
    GROUP BY UWZone.UWZoneID, UWZone.UWZoneName, Branch.BranchID, Branch.BranchName, SR01.ServicingRep, UW.UWID, ISNULL(UW.UWName,'') + '/' + ISNULL(UA.UWName, '')     

结果:

正如@Johan 在评论中所说:

这将只在您描述的场景中给您 1 行:

GROUP BY 
  ISNULL(UWZone.UWZoneID,''),
  ISNULL(UWZone.UWZoneName,''),
  Branch.BranchID,
  ISNULL(Branch.BranchName,'') ,
  UW.UWID,
  ISNULL(UW.UWName,''),
  ISNULL(UA.UWName, '')

尝试 "select distinct" 作为分组依据的列,以及 LEN 以查看它们是否有空格或其他看不到的字符,并测试 NULL。然后,您决定如何使用 ISNULL、COALESCE、CASE、and/or WHERE 语句来处理这些列,具体取决于您的需要。