Sql 在一个查询中结合两个计数和联接

Sql 在一个查询中结合两个计数和联接,sql,sql-server,join,count,case-when,Sql,Sql Server,Join,Count,Case When,好的,希望有人能帮助我,因为我在这里挣扎。已尝试使用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.usern

好的,希望有人能帮助我,因为我在这里挣扎。已尝试使用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的结果,一个列显示查询2的结果。感谢您的帮助

您可以在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;

您可以在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的连接放在哪里?抱歉,没有注意到它们是不同的表。我添加了另一个解决方案。我将log2的联接放在哪里?抱歉,没有注意到它们是不同的表。我添加了另一个解决方案。找到了缺少的逗号,但现在它与上一个不一样line@mato你说它不像最后一行是什么意思?这是一个非常有用的查询。。。不确定这是否是问题的最佳答案:)找到了缺少的逗号,但现在它不喜欢最后一个line@mato你说它不像最后一行是什么意思?这是一个非常有用的查询。。。但不确定这是否是该问题的最佳答案:)