使用 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
TotalCount
和RN
中的值不一样,所以每组一行。因此 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
;
我有 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
TotalCount
和RN
中的值不一样,所以每组一行。因此 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
;