sql - 使用 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;
解决方案
您看到问题中描述的结果的原因是您按所有这些字段分组:
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
;
推荐阅读
- android - AAPT:错误:使用 androidx.constraintlayout.widget.ConstraintLayout 时出现未绑定前缀错误
- javascript - 如何为“then”中的变量赋值?
- c - 如何根据c中的位置打印字符串?
- python - 如何有效地在 Python 中实现递归 DFS?
- python - 在邮箱 imap_tools 库中搜索条件以进行查询
- python - 使用 uWSGI 运行时无法执行 Postgres 查询
- c# - 是否可以将 ASP.Net Core 3.1 Web 应用程序作为单个文件发布
- jquery - 动态内容不听显示/隐藏功能
- python - 数据正在合并到一列
- openstreetmap - 使用 OpenStreetMap 查找当前街道上的下一个路口