我正在尝试计算在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);
答案 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)