带有 COUNT() 函数的 SQL 联合未返回预期结果
Posted
技术标签:
【中文标题】带有 COUNT() 函数的 SQL 联合未返回预期结果【英文标题】:SQL Union with COUNT() Function not returning expected results 【发布时间】:2012-01-20 20:37:46 【问题描述】:我正在尝试返回所有使用过语音会议的 MSFT Lync 用户及其使用次数。我必须使用 UNION,因为表中有 User1 和 User2,他们都参加了我想要在一列中的会议。
这里是 SQL:
SELECT U.UserUri,
COUNT(U.UserUri) AS COUNT
FROM SessionDetails AS S
INNER JOIN Users U
ON S.User1Id = U.UserId
WHERE MediaTypes = 48
GROUP BY U.UserUri
UNION
SELECT U.UserUri,
COUNT(U.UserUri) AS COUNT
FROM SessionDetails AS S
INNER JOIN Users U
ON S.User2Id = U.UserId
WHERE MediaTypes = 48
GROUP BY U.UserUri
返回的结果有参加过一次以上会议的任何人出现在列表中两次,总数为两次。实际上,在输入后它必须按 User1Id 和 User2ID 分组。如果一个人有 9 次对话,但只发起了 6 次对话,那么他们将是 User1 6 次和 User2 3 次,从而创建两个不同的分组。
现在我知道为什么了,但是有什么想法可以不返回重复的 UserUri 吗?非常感谢任何帮助!
【问题讨论】:
【参考方案1】:在UNION之后做聚合吗?
SELECT
T.UserUri, COUNT(*)
FROM
(
SELECT U.UserUri
FROM SessionDetails AS S
INNER JOIN Users U
ON S.User1Id = U.UserId
WHERE MediaTypes = 48
UNION ALL
SELECT U.UserUri
FROM SessionDetails AS S
INNER JOIN Users U
ON S.User2Id = U.UserId
WHERE MediaTypes = 48
) T
GROUP BY
T.UserUri
编辑:固定别名,将 ALL 添加到 UNION
【讨论】:
嗯似乎是个好主意,但它给了我错误:“无效的列名'U'”。好像不喜欢select语句中的U. 其实不喜欢T.U.在第一个选择语句中 此解决方案不起作用,因为如果您在联合之后聚合它只是 UserUri 的列表,并且每个的计数为 1。 请将答案编辑为 UNION ALL。使用 UNION ALL 会返回所有数据,而不仅仅是 UserUri 并给出正确的结果。感谢您的帮助!以上是关于带有 COUNT() 函数的 SQL 联合未返回预期结果的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 中使用带有框架的窗口函数执行 COUNT(DISTINCT)