2017-08-16 17 views
0

2つのアプリケーションのうち1つで非アクティブなユーザーの数を数えようとしています。2つのテーブルの左結合でユーザーをカウントするSQLクエリ

私は2つのテーブル - UsersテーブルとUser_Applicationsテーブルを持っています。このテーブルには、ユーザID、アプリケーションID、およびブール値を含む行があり、それらがアクティブでも非アクティブでもあります。

ユーザがアプリケーションにアクセス権を与えられている場合、行がUser_Applicationsに追加されます。したがって、App AとApp Bにアクセス権が与えられている場合、2行あります。 App Aのみにアクセス権が与えられている場合は、1行しかありません。

App Bに関してUser_Applicationsにレコードが存在しない場合、ユーザーは非アクティブです。レコードがUser_Applicationsでユーザーのために全く存在しない場合、彼らはこのように参加想像し、両方のアプリケーションAおよびアプリケーションB.

で不活性である:

| user_id | app_id | active | 
|---------|--------|--------| 
| 1  | 'A' | false | 
| 1  | 'B' | true | 
| 2  | null | null | 
| 3  | 'B' | true | 

私は、ユーザーの数をカウントしていた場合、誰がAで非アクティブである場合、ユーザー1、ユーザー2、およびユーザー3はすべて非アクティブです。しかし、私のSQLスクリプトは、1と2のようなユーザーしかカウントしません.3のようなユーザーはカウントされません。

私は、App Aにおける非アクティブなユーザーの数をカウントするために、このSQLスクリプトを書いた:

SELECT COUNT(*) FROM Users u 
LEFT JOIN User_Applications s on u.user_id = s.user_id 
WHERE (s.app_id = 'A' OR s.app_id IS NULL) 
AND (s.active = false OR s.active IS NULL); 

答えて

0

は、あなたが探しているものを以下のコードですか?

SELECT COUNT(*) FROM Users u 
LEFT JOIN User_Applications s on u.user_id = s.user_id 
WHERE (s.app_id = 'A' OR s.app_id = 'B' OR s.app_id IS NULL) AND (s.active = false OR s.active IS NULL); 
0

条件付きCOUNT()を使用して、代わりに各ユーザーのアクティブなアプリの数を数えてみます。そして、あなたはそれが

COUNT() nullでカウントされません追加していない場合はそうも動作する、2つのアクティブアプリケーション

SELECT COUNT(*) 
FROM (
    SELECT COUNT(CASE WHEN s.active THEN 1 ELSE NULL END) 
    FROM Users u 
    LEFT JOIN User_Applications s 
     ON u.user_id = s.user_id 
    GROUP BY user_id 
    HAVING COUNT(CASE WHEN s.active THEN 1 END) < 2 
) T 

私はELSE NULLを追加しますがELSEのデフォルト値はありません誰がカウントされます。だから、ユーザーがアプリケーションの許可を持っていない場合は、nullが返され、ユーザーがアクティブでない場合、CASEはヌルを返し、カウントしません。

したがって、2人のアクティブなアプリケーション。 ( 'A'、 'B')から最大1アクティブなアプリケーションと

0

カウントユーザーリスト

SELECT COUNT(*) FROM Users u 
LEFT JOIN ( 
    SELECT user_id, COUNT(*) nActive 
    FROM User_Applications 
    WHERE app_id IN ('A' , 'B') AND active 
    GROUP BY user_id 
) s on u.user_id = s.user_id 
WHERE (s.nActive <= 1 OR s.nActive IS NULL) 
+0

は<= '1 https://stackoverflow.com/questions/4970314/can 'をチェックする必要があります-count-ever-return-null –

関連する問題