带有 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 联合未返回预期结果的主要内容,如果未能解决你的问题,请参考以下文章

Hive sql及窗口函数

如何在 SQL Server 中使用带有框架的窗口函数执行 COUNT(DISTINCT)

SQL COUNT() 函数

带有 HAVING 子句的 SQL 查询的 COUNT 个结果

SQL COUNT() 函数

实战 | 代码审计中的SQL注入和预编译中的SQL注入