计算每个ID在mysql中每种类型的交易量

时间:2020-04-06 08:34:15

标签: mysql sql group-by count pivot

有3张桌子

用户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 个答案:

答案 0 :(得分:1)

您可以加入并进行条件聚合:

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():此聚合函数考虑了所有非空值:因此,10都被计入。所以您可以使用sum()(如上所示),也可以更改case表达式以在没有匹配项时返回null,例如:

COUNT(CASE WHEN type = 'Sports' THEN 1 END), 
COUNT(CASE WHEN type = 'Fashion' THEN 1 END) 

旁注:大概是您想要inner join而不是left join。看来您的数据没有孤立记录-inner joinleft join更有效。

Demo on DB Fiddle

id | sports | fashion
-: | -----: | ------:
 1 |      2 |       0
 2 |      0 |       1
 3 |      0 |       1
 4 |      2 |       0