sql - 如何在特定条件后对特定列求和(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
推荐阅读
- c++ - 使用标准 C++ 库调试符号?Ubuntu / Linux / libstdc++6-8-dbg?
- python - 添加和访问 numpy 结构化数组的对象类型字段
- mysql - 如何在mysql中转置表?
- python-3.7 - 由于错误而无法安装 pandas
- apache-spark - 如何在独立模式下将自定义 SPARK_CONF_DIR 传递给从站
- javascript - 提示在输入中输入名称
- node.js - 由于我自己不知道的原因,似乎无法让 res.cookie 设置 cookie,为什么会这样?
- nginx - 建立相对于新路径的链接
- angular-dart - 如何创建自定义列表组件,允许子格式通过 AngularDart 中的循环变量传递?
- android - 如何将 Android ListView 的单元格高度设置为单元格宽度的一半?