3

私は次のSQLを持っています:

SELECT 
    ud.firstname + ' ' + ud.lastname, 
    COUNT(a.createdDate) AS ActivityCount, 
    au.LastActivityDate
FROM 
    dbo.aspnet_Users au 
    INNER JOIN dbo.UserDetails ud 
    ON au.UserId = ud.AspNetUserId
    LEFT OUTER JOIN dbo.audit a 
    ON au.LoweredUserName = a.username
WHERE 
    (
        au.LoweredUserName IN ('u1', 'u2', 'u3')
    ) 
AND a.createdDate > '2012-09-18'
GROUP BY ud.firstname + ' ' + ud.lastname, au.LastActivityDate
ORDER BY au.LastActivityDate DESC

しかし、 and はその後アクティビティがないu1としましょう-- その場合、結果には のみが含まれます。u32012-09-18u2

LEFT OUTER JOINすべてのレコードを確実に取得したと思いましたが、これは、別のテーブルをフィルタリングする句aspnet_Usersの秒条件によるものだと思います...WHERE

指定されたすべてのユーザーを取得し、指定された期間のデータが存在しない場合に ActivityCount としてゼロを取得するには、何を変更する必要がありますか?

4

2 に答える 2

4

しかし、これは、別のテーブルをフィルタリングする WHERE 句の秒条件によるものだと思います...

createdDateそうです、 in句の条件WHEREは からのレコードを抑制していますdbo.auditLEFT OUTER JOINそれを条件リストに移動して、目的の結果を得ることができます。

于 2012-09-19T09:33:45.377 に答える
0
SELECT 
    ud.firstname + ' ' + ud.lastname,
    sum(case when a.createdDate is null then 0 else 1 end) AS ActivityCount, 
    au.LastActivityDate
FROM 
    dbo.aspnet_Users au 
    INNER JOIN dbo.UserDetails ud 
    ON au.UserId = ud.AspNetUserId
    LEFT OUTER JOIN dbo.audit a 
    ON au.LoweredUserName = a.username
WHERE 
    (au.LoweredUserName IN ('u1', 'u2', 'u3')) 
AND (a.createdDate > '2012-09-18' or a.createdDate is null)
GROUP BY 
    ud.firstname + ' ' + ud.lastname,
    au.LastActivityDate
ORDER BY au.LastActivityDate DESC
于 2012-09-19T09:31:06.820 に答える