首页 > 解决方案 > 使用 HAVING COUNT(column name) 未按预期工作

问题描述

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

位置系统 ID 地点名称 代理编号 RepID 代表名 数数 注册护士
5 A-MAX 22810 17025 梅尔 339 1
43 进阶 21371 17025 梅尔 100 1
43 进阶 21371 17025 梅尔 0 2
94 高山 21249 17025 梅尔 64 1
94 高山 21249 17025 梅尔 0 2
126 AMS 21537 17025 梅尔 333 1
138 进阶 22812 17025 梅尔 1180 1

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

任何帮助/方向将不胜感激。谢谢。

这是我的 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;

标签: sqlsql-servertsqlsql-server-2016

解决方案


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

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

TotalCount和中的值RN不一样,所以每组只有一行。因此COUNT(),函数永远不会返回任何东西,但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
;

推荐阅读