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 语句来处理这些列,具体取决于您的需要。
我有一个 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 语句来处理这些列,具体取决于您的需要。