当 fk_user_id 的任何行中都不存在按值分组时,如何在 Count(field) 中获取 0 作为值

How can I get 0 as value in Count(field) when Group by value is not present in any row for fk_user_id

我已在此处提供了所有必需的 sql 查询。当前,当我 运行 在 Group By 查询下方时,如果该用户至少存在 1 种颜色,它会为每个 fk_user_id 提供 O/P。

我已经在 Stack Overflow 上浏览了所有可用的解决方案,但在每个解决方案中只有 1 个字段作为分组依据,我想按顺序对 2 个字段进行分组。

如果 Color 对该用户不可用,我希望该用户的 count(*) 值为 0。

例如。在下面的查询中,fk_user_id(37 和 75)分别只包含 1 行颜色白色和黑色。我想要与 for

相同的结果,多 2 行

fk_user_id=37 颜色黑色为 0 票并且

fk_user_id=75 颜色白色为 0 票

创建Table查询

CREATE TABLE public.color_value
(
  id bigint,
  color character varying(15),
  fk_user_id bigint
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.color_value
  OWNER TO postgres;

插入数据查询

INSERT INTO public.color_value(id, color, fk_user_id)
    VALUES
(1, 'Black', 15), (2, 'White', 27), (3, 'White', 54), (4, 'Black', 75), (5, 'Black', 27), (6, 'Black', 97), (7, 'White', 37), 
(8, 'Black', 58), (9, 'White', 15), (10, 'Black', 54), (11, 'White', 97), (12, 'White', 58), (13, 'White', 54), (14, 'Black', 75),
(15, 'Black', 27), (16, 'Black', 97), (17, 'White', 37), (18, 'Black', 58), (19, 'Black', 15), (20, 'White', 27), (21, 'White', 54),
(22, 'Black', 75), (23, 'Black', 27), (24, 'Black', 97), (25, 'White', 37), (26, 'Black', 58), (27, 'White', 15), (28, 'White', 37),
(29, 'Black', 58), (30, 'White', 15), (31, 'Black', 54), (32, 'White', 97), (33, 'White', 58), (34, 'White', 54), (35, 'Black', 75);

Select 分组查询

select count(*) AS vote, color, fk_user_id 
from color_value 
group by fk_user_id, color 
order by fk_user_id, color;

当前输出

提前致谢。

您可以先枚举用户和颜色,然后将 table 带左连接:

select count(cv.color) AS vote, u.fk_user_id, c.color 
from (select distinct color from color_value) c
cross join (select distinct fk_user_id from color_value) u
left join color_value cv on cv.fk_user_id = u.fk_user_id and cv.color = c.color
group by u.fk_user_id, c.color 
order by u.fk_user_id, c.color;