【问题标题】:Combining two counts with joins in one query在一个查询中将两个计数与连接结合起来
【发布时间】:2014-06-10 16:17:57
【问题描述】:

好的 - 希望有人能在我在这里苦苦挣扎时提供帮助。已尝试使用 sum(case when)、count(*)、子查询,但均未成功。 本质上,我有两个查询我试图合并为一个,按相同的参数分组。查询:

查询 1:

SELECT
u.username,
count(*) as 'Total'

FROM log1 L1
JOIN users u on u.userref = L1.userref
WHERE L1.date between @FromDate and @ToDate
GROUP BY u.username
ORDER BY u.username

查询 2:

SELECT
u.username,
count(*) as 'Total'

FROM log2 L2
LEFT JOIN users u on u.userref = L2.userref
WHERE L2.date between @FromDate and @ToDate and L2.message like '%None%'
GROUP BY u.username
ORDER BY u.username

我想要的是一个带有用户名列 (u.username) 的单个查询,一列显示查询 1 的结果,一列显示查询二的结果。任何帮助表示赞赏!

【问题讨论】:

    标签: sql sql-server join count case-when


    【解决方案1】:

    您可以在 count 函数中放置一个 case 语句,以便仅在满足某些条件时才进行计数:

    SELECT  u.username,
            Total = COUNT(*),
            Total2 = COUNT(CASE WHEN L.message LIKE '%None%' THEN 1 END)
    FROM    log1 AS L
            JOIN users AS u 
                ON u.userref = L.userref
    WHERE   L.date BETWEEN @FromDate and @ToDate
    GROUP BY u.username
    ORDER BY u.username;
    

    注意:

    编辑

    完全错过了您有两个单独的日志表:

    SELECT  u.username,
            Total = COUNT(Count1),
            Total2 = COUNT(Count2)
    FROM    (   SELECT  l.UserRef, Count1 = 1, Count2 = NULL
                FROM    log1 AS L
                WHERE   L.date BETWEEN @FromDate and @ToDate
                UNION ALL
                SELECT  l.UserRef, Count1 = NULL, Count2 = 1
                FROM    log2 AS L
                WHERE   L.date BETWEEN @FromDate and @ToDate
                AND     L.message LIKE '%None%'
            ) AS l
            JOIN users AS u 
                ON u.userref = L.userref
    GROUP BY u.username
    ORDER BY u.username;
    

    【讨论】:

    • 我应该把 log2 的连接放在哪里?
    • 抱歉,错过了它们是不同的表。我添加了一个替代解决方案。
    【解决方案2】:
               SELECT X.USERNAME,X.TOTAL,Y.TOTAL 
        FROM(SELECT
                u.username,
                count(*) as 'Total'
                FROM log1 L1
                JOIN users u on u.userref = L1.userref
                WHERE L1.date between @FromDate and @ToDate
                GROUP BY u.username
    
                ) as x
    INNER JOIN
                (
                SELECT
                u.username,
                count(*) as 'Total'
                FROM log2 L2
                LEFT JOIN users u on u.userref = L2.userref
                WHERE L2.date between @FromDate and @ToDate and L2.message like '%None%'
                GROUP BY u.username
                ) AS Y ON Y.USERNAME = X.USERNAME
    

    【讨论】:

    • 找到了缺少的逗号,但现在它不像最后一行了
    • @mato 你是什么意思它看起来不像最后一行?
    • 这是一个非常有用的查询......但不确定它是否是该问题的最佳答案:)
    猜你喜欢
    • 2020-11-04
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2015-07-16
    • 2017-05-17
    • 1970-01-01
    相关资源
    最近更新 更多