Как я могу получить 0 как значение в Count (поле), когда Group by value отсутствует ни в одной строке для fk_user_id - PullRequest
0 голосов
/ 16 июня 2020

Я предоставил здесь все необходимые sql запросы. В настоящее время, когда я запускаю запрос «Группировать по», он дает мне O / P для каждого fk_user_id, если для этого пользователя присутствует хотя бы 1 цвет.

Я уже просмотрел все доступные решения на Stack Overflow, но в каждом решении есть только 1 поле в виде группы по, и я хочу сгруппировать по 2 поля последовательно.

Я хочу count ( *) как значение 0 для любого пользователя, если Color недоступен для этого пользователя.

Например, в запросе ниже fk_user_id (37 и 75) содержит только 1 строку для белого и черного цветов соответственно. Я хочу получить тот же результат с еще 2 строками, как для

fk_user_id = 37 и цвет черный как 0 голосов и

fk_user_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;

Текущий вывод

enter image description here

Заранее благодарю

1 Ответ

1 голос
/ 16 июня 2020

Вы можете сначала перечислить пользователей и цвета, а затем привести таблицу с левым соединением:

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;
...