我有users
桌子
Table "public.users"
Column | Type | Modifiers
--------+---------+-----------
user_id | integer |
style | boolean |
id | integer |
和一张access_rights
桌子
Table "public.access_rights"
Column | Type | Modifiers
--------+---------+-----------
user_id | integer |
id | integer |
我有一个查询,在访问权限上加入了用户,我想计算样式列中为true的值的数量。
从这个答案:postgresql-sql-`true`值的计数,我尝试做
SELECT COUNT( CASE WHEN style THEN 1 ELSE null END )
from users
join access_rights on access_rights.user_id = users.user_id
;
但是,当用户有多个access_rights行时,这将计算重复值。使用联接时,如何只计数一次值?
如果您对至少有1行带有的(style IS TRUE
)用户感兴趣access_rights
,请access_rights
在加入之前进行汇总:
SELECT count(style OR NULL) AS style_ct
FROM users
JOIN (
SELECT user_id, bool_or(style) AS style
FROM access_rights
GROUP BY 1
) u USING (user_id);
使用JOIN
,因为没有任何输入的用户access_rights
在这种情况下不算在内。
使用聚合函数bool_or()
。
或者更简单:
SELECT count(*) AS style_ct
FROM (
SELECT user_id
FROM access_rights
GROUP BY 1
HAVING bool_or(style)
);
这是假设外键加强了参照完整性,因此没有中access_rights.user_id
没有相应的行users
。
同样假设NULL
in中没有值access_rights.user_id
,这将使计数增加1-并可以通过使用count(user_id)
代替来抵消count(*)
。
或者(如果该假设不成立)使用EXISTS
半联接:
SELECT count( EXISTS (
SELECT 1
FROM access_rights
WHERE user_id = u.user_id
AND style -- boolean value evaluates on its own
) OR NULL
)
FROM users u;
我正在使用真实boolean
值的功能来简化计数和WHERE
子句。详细信息:
在同一SELECT sql查询中从SUM()计算百分比
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句