【问题标题】:SQL Union with COUNT() Function not returning expected results带有 COUNT() 函数的 SQL 联合未返回预期结果
【发布时间】: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 吗?非常感谢任何帮助!

【问题讨论】:

    标签: sql count union lync


    【解决方案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 并给出正确的结果。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多