当fk\u user\u id的任何行中都不存在group by value时,如何在count(字段)中获取0作为值

vu8f3i0k  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(375)

我在这里提供了所有必需的sql查询。当前,当我运行下面的分组查询时,如果每个fk\u用户的id至少有一种颜色,它将为我提供o/p。
我已经讨论了所有可用的解决方案,但在每个解决方案中只有一个字段作为groupby,我想按顺序对两个字段进行分组。
我想计数(*)为0值为任何用户,如果颜色不适用于该用户。
例如,在下面的查询中,fk\u user\u id(37和75)分别只包含一行白色和黑色。我想要两行以上相同的结果
fk\u user\u id=37,黑色为0和
fk\u user\u id=75,白色为0

创建表查询

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 count(*) AS vote, color, fk_user_id 
from color_value 
group by fk_user_id, color 
order by fk_user_id, color;

电流输出


先谢谢你。

ippsafx7

ippsafx71#

您可以先枚举用户和颜色,然后将表与左联接:

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;

相关问题