有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
因此,它无法按预期工作。
答案 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()
:此聚合函数考虑了所有非空值:因此,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
更有效。
id | sports | fashion -: | -----: | ------: 1 | 2 | 0 2 | 0 | 1 3 | 0 | 1 4 | 2 | 0