如何在特定条件后对特定列求和(Postgres)
How to sum a specific column after a specific criteria (Postgres)
我有这个代码
SELECT s.name AS School,
count(distinct u.id) filter (where ut.app_name = 'A' or ut.app_name = 'G') AS A,
count(distinct u.id) filter (where ut.app_name = 'B' or ut.app_name = 'J') AS B,
count(distinct u.id) filter (where ut.app_name = 'C') AS C,
count(distinct u.id) filter (where ut.app_name = 'D') AS D
FROM "public"."user_tokens" ut JOIN
"public"."users" u
ON ut.user_id = u.id JOIN
"public"."user_roles" ur
ON ut.user_id = ur.user_id JOIN
"public"."roles" r
ON ur.role_id = r.id JOIN
"public"."schools" s
ON ur.school_id = s.id
GROUP BY s.name
having count(distinct u.id) filter (where ut.app_name = 'A' or ut.app_name = 'G') > 0
and count(distinct u.id) filter (where ut.app_name = 'B' or ut.app_name = 'J') > 0
and count(distinct u.id) filter (where ut.app_name = 'C') > 0
以上代码的结果是
School A B C D
------------------------------------------
P 5 3 2 5
S 1 4 4 9
T 2 3 5 2
U 2 1 3 1
我想对 A 列求和,因此预期结果将是 10
。任何启示如何去做?谢谢。
您已经找到了解决方案,正如您在评论中所写,这只是为了展示如何使用别名而不是在 HAVING 中重复计算:
select sum(A)
from
(
SELECT s.name AS School,
count(distinct u.id) filter (where ut.app_name = 'A' or ut.app_name = 'G') AS A,
count(distinct u.id) filter (where ut.app_name = 'B' or ut.app_name = 'J') AS B,
count(distinct u.id) filter (where ut.app_name = 'C') AS C,
count(distinct u.id) filter (where ut.app_name = 'D') AS D -- can be removed, not used
FROM "public"."user_tokens" ut JOIN
"public"."users" u
ON ut.user_id = u.id JOIN
"public"."user_roles" ur
ON ut.user_id = ur.user_id JOIN
"public"."roles" r
ON ur.role_id = r.id JOIN
"public"."schools" s
ON ur.school_id = s.id
GROUP BY s.name
) as dt
where A> 0
and B > 0
and C > 0
我有这个代码
SELECT s.name AS School,
count(distinct u.id) filter (where ut.app_name = 'A' or ut.app_name = 'G') AS A,
count(distinct u.id) filter (where ut.app_name = 'B' or ut.app_name = 'J') AS B,
count(distinct u.id) filter (where ut.app_name = 'C') AS C,
count(distinct u.id) filter (where ut.app_name = 'D') AS D
FROM "public"."user_tokens" ut JOIN
"public"."users" u
ON ut.user_id = u.id JOIN
"public"."user_roles" ur
ON ut.user_id = ur.user_id JOIN
"public"."roles" r
ON ur.role_id = r.id JOIN
"public"."schools" s
ON ur.school_id = s.id
GROUP BY s.name
having count(distinct u.id) filter (where ut.app_name = 'A' or ut.app_name = 'G') > 0
and count(distinct u.id) filter (where ut.app_name = 'B' or ut.app_name = 'J') > 0
and count(distinct u.id) filter (where ut.app_name = 'C') > 0
以上代码的结果是
School A B C D
------------------------------------------
P 5 3 2 5
S 1 4 4 9
T 2 3 5 2
U 2 1 3 1
我想对 A 列求和,因此预期结果将是 10
。任何启示如何去做?谢谢。
您已经找到了解决方案,正如您在评论中所写,这只是为了展示如何使用别名而不是在 HAVING 中重复计算:
select sum(A)
from
(
SELECT s.name AS School,
count(distinct u.id) filter (where ut.app_name = 'A' or ut.app_name = 'G') AS A,
count(distinct u.id) filter (where ut.app_name = 'B' or ut.app_name = 'J') AS B,
count(distinct u.id) filter (where ut.app_name = 'C') AS C,
count(distinct u.id) filter (where ut.app_name = 'D') AS D -- can be removed, not used
FROM "public"."user_tokens" ut JOIN
"public"."users" u
ON ut.user_id = u.id JOIN
"public"."user_roles" ur
ON ut.user_id = ur.user_id JOIN
"public"."roles" r
ON ur.role_id = r.id JOIN
"public"."schools" s
ON ur.school_id = s.id
GROUP BY s.name
) as dt
where A> 0
and B > 0
and C > 0