подсчитать количество транзакций по типу на ID в mysql - PullRequest
0 голосов
/ 06 апреля 2020

Наличие трех таблиц

Пользователи u

 ID    email

 1     ..
 2     ..
 3     ..
 4     ..

Транзакции t

 userID    transactionID    productID

 1         1111             999
 1         1112             897
 2         1222             989
 3         1333             989
 4         1444             897
 4         1114             897

Продукты p

 productID      type

 999            Sports
 989            Fashion
 789            Fashion
 897            Sports

Хотите создать таблицу в котором я могу найти общее количество типов на UserID. Поэтому в конечном итоге я хочу создать следующее

UserID    Sports   Fashion
1         1        1
2         0        1
3         0        1
4         2        0

Попытка с использованием следующего кода

SELECT u.email, 
       p.productID, 
       COUNT(CASE WHEN type = 'Sports' THEN 1 ELSE 0 END), 
       COUNT(CASE WHEN type = 'Fashion' THEN 1 ELSE 0 END) 
from transactions t 
LEFT JOIN users u ON u.ID = t.userID 
LEFT JOIN products p ON t.productID = p.productID 
group by u.email

Следовательно, это не работает так, как ожидалось.

1 Ответ

1 голос
/ 06 апреля 2020

Вы можете присоединиться и выполнить условное агрегирование:

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