使用 HAVING COUNT(column name) 未按预期工作

Using HAVING COUNT(column name) NOT working as expected

我有 SQL 语句,在 SQL Server 2016 中工作,在下面我从 INNER SELECT UNION ALL 语句和 OUTER SELECT 我正在尝试提取那些符合 HAVING COUNT 代码的记录,但是我的代码没有带回任何记录。
以下是我的 INNER SELECT 声明中使用 UNION ALL 的记录:

LocationSysID 地点名称 代理号 RepID 代表姓名 计数 RN
5 A-MAX 22810 17025 梅尔 339 1
43 ADV 21371 17025 梅尔 100 1
43 ADV 21371 17025 梅尔 0 2
94 高山 21249 17025 梅尔 64 1
94 高山 21249 17025 梅尔 0 2
126 AMS 21537 17025 梅尔 333 1
138 ADV 22812 17025 梅尔 1180 1

我正在尝试通过 OUTER SELECT 从 INNER select 语句中获取这些记录,其中 COUNT(LocationSysID) > 1。因此 LocationSysID 为 43 和 94 的 4 条记录将被退回。

任何help/direction将不胜感激。谢谢

这是我的 SQL 代码:

SELECT x.LocationSysID, x.LocationName, x.AgentNo, x.RepID, x.RepName, x.TotalCount, x.RN
FROM (
    SELECT q.LocationSysID, q.LocationName, q.AgentNo, q.RepID, q.RepName, q.QuoteCount as TotalCount, '1' as RN
    FROM #tempYesQuotes q 
    WHERE q.QuoteCount > 0
    --ORDER BY LocationSysID asc;

    UNION ALL

    SELECT p.LocationSysID, p.LocationName, p.AgentNo, p.RepID, p.RepName, p.PolicyCount as TotalCount, '2' as RN
    FROM #tempNoNewPolicies p
    WHERE p.PolicyCount = 0
    --ORDER BY LocationSysID asc, RN asc;
) x
GROUP BY LocationSysID, LocationName, AgentNo, RepID, RepName, TotalCount, RN
HAVING COUNT(LocationSysID) > 1  
ORDER BY LocationSysID asc, RN asc;

而不是外部 select,CTE 可以帮助您获得清晰的图片

试试下面的方法

;WITH X
AS
    (
    SELECT q.LocationSysID, q.LocationName, q.AgentNo, q.RepID, q.RepName, q.QuoteCount as TotalCount, '1' as RN
    FROM #tempYesQuotes q 
    WHERE q.QuoteCount > 0
    --ORDER BY LocationSysID asc;

    UNION ALL

    SELECT p.LocationSysID, p.LocationName, p.AgentNo, p.RepID, p.RepName, p.PolicyCount as TotalCount, '2' as RN
    FROM #tempNoNewPolicies p
    WHERE p.PolicyCount = 0
    --ORDER BY LocationSysID asc, RN asc;
    )
SELECT x.LocationSysID, x.LocationName, x.AgentNo, x.RepID, x.RepName, x.TotalCount, x.RN
WHERE X.LocationSysID IN(SELECT X1.LocationSysID FROM X X1 GROUP BY X1.LocationSysID HAVING COUNT(1) > 1)
ORDER BY X.LocationSysID asc, X.RN asc;

您看到问题中描述的结果的原因是因为您按所有这些字段分组:

GROUP BY LocationSysID, LocationName, AgentNo, RepID, RepName, TotalCount, RN

TotalCountRN中的值不一样,所以每组一行。因此 COUNT() 函数从不 returns 除了 1.

因此,如果您只是更改 GROUP BY 子句并从中删除列 TotalCount, RN,您将获得预期的结果。 但是,使用您拥有的查询结构,您还必须从最终结果集中删除这些列。

我猜你想保留它们。为此,我建议使用窗口 COUNT() OVER() 函数而不是普通的 COUNT.

我在这里使用 CTE 来使查询可读。如果需要,您可以将它们内联到一个大型查询中。不影响性能。

WITH
CTE_Union
AS
(
    SELECT q.LocationSysID, q.LocationName, q.AgentNo, q.RepID, q.RepName, q.QuoteCount as TotalCount, '1' as RN
    FROM #tempYesQuotes q 
    WHERE q.QuoteCount > 0
    --ORDER BY LocationSysID asc;

    UNION ALL

    SELECT p.LocationSysID, p.LocationName, p.AgentNo, p.RepID, p.RepName, p.PolicyCount as TotalCount, '2' as RN
    FROM #tempNoNewPolicies p
    WHERE p.PolicyCount = 0
    --ORDER BY LocationSysID asc, RN asc;
)
,CTE_RowCount
AS
(
    SELECT
        LocationSysID, LocationName, AgentNo, RepID, RepName, TotalCount, RN
        ,COUNT(*) OVER (PARTITION BY LocationSysID) AS LocationCount
    FROM
        CTE_Union
)
SELECT
    LocationSysID, LocationName, AgentNo, RepID, RepName, TotalCount, RN
FROM
    CTE_RowCount
WHERE
    LocationCount > 1
ORDER BY
    LocationSysID asc, RN asc
;