SQL Query用于计算具有2个表的左连接的用户

时间:2017-08-16 17:54:04

标签: sql postgresql

我正在尝试计算在2个应用程序中的1个中处于非活动状态的用户数。

我有2个表 - Users表和User_Applications表,其中包含用户ID,应用程序ID和布尔值的行,无论它们是活动还是非活动。

如果已授予用户访问应用程序的权限,则会向User_Applications添加一行。因此,如果他们已获得App A和App B的访问权限,则有2行。如果他们只能访问App A,则只有一行。

假设如果User_Applications中没有关于App B的记录,则该用户处于非活动状态。如果User_Applications中的用户根本没有记录,则它们在App A和App 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那样计算用户。如何在查询中包含#3这样的用户?

我编写了这个SQL脚本来计算App A中非活动用户的数量:

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);

3 个答案:

答案 0 :(得分:0)

代码是否低于您正在寻找的代码?

set "postime=%time%"
if /i "%TIMECHANGE%" == "y" (
    SET /P POSTIME=Please enter new time (HH:MM:SS):
)
time "%POSTIME%"

答案 1 :(得分:0)

只需使用条件COUNT(),然后尝试计算每个用户有多少活动应用。然后你算一下谁没有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的默认值,所以如果你不添加它也可以工作

COUNT()不计算空值。因此,如果用户没有该应用的权限,则left join返回null并且不会计算,如果用户未激活,则CASE也将返回null并且不会计数

所以你会找到那些没有2个活动应用程序的人。

答案 2 :(得分:0)

从(&#39; A&#39;,&#39; B&#39;)列表中计算最多1个有效应用的用户

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)