Вы можете присоединиться и выполнить условное агрегирование:
select
u.id,
sum(p.type = 'Sports') sports,
sum(p.type = 'Fashion') fashion
from users u
inner join transactions t on t.userid = u.id
inner join products p on p.id = t.productid
group by u.id
Проблема с вашим исходным запросом заключается в использовании count()
: эта функция агрегатов учитывает все ненулевые значения: поэтому оба 1
и 0
учитываются. Таким образом, вы можете либо использовать sum()
(как показано выше), либо изменить выражение case
, чтобы оно возвращало null
при отсутствии совпадения, например:
COUNT(CASE WHEN type = 'Sports' THEN 1 END),
COUNT(CASE WHEN type = 'Fashion' THEN 1 END)
Примечание: предположительно, вы хотите inner join
вместо left join
. Не похоже, что ваши данные содержат потерянные записи - и inner join
более эффективен, чем left join
.
Демонстрация на DB Fiddle :
id | sports | fashion
-: | -----: | ------:
1 | 2 | 0
2 | 0 | 1
3 | 0 | 1
4 | 2 | 0