我有两个表,一个Events表和一个Category表。数据看起来像这样(简化为省略日期):
Events:
Name | catid
John 35
Mary 36
Ed 37
John 38
Tom 39
Mary 40
Category:
catid | category
35 run
35 swim
36 bike
36 swim
36 run
37 bike
38 swim
39 swim
40 run
如果您认为事件表中的每一行都是另一天,那么我们会有一个人以及该人在当天执行的一项或多项活动。让我们在星期天说约翰参加了跑步和游泳的“catid'在Events表中引用Category表中的两个活动。
我想要做的是获得一个具有不同名称的表格以及他们随着时间推移执行的每项活动的计数。像这样:
Name | run | swim |bike
Ed 1
John 1 2
Mary 1 1
Tom 1
我知道我可能需要一些JOIN命令,但我不确定如何设置SQL语句。
答案 0 :(得分:0)
尝试这样的事情
SELECT
e.Name,
SUM(CASE WHEN c.Category = 'run' THEN 1 ELSE 0 END) as run,
SUM(CASE WHEN c.Category = 'swim' THEN 1 ELSE 0 END) as swim,
SUM(CASE WHEN c.Category = 'bike' THEN 1 ELSE 0 END) as bike
FROM Events as e
LEFT JOIN Category as c ON c.catid = e.catid
GROUP BY e.Name, e.catid
编辑:我没注意到您的数据集中有2个Johns。我已修改查询以解决此问题。我还添加了一个SQL小提琴来显示更改。
EDIT2 :With ROLL UP
答案 1 :(得分:0)
我认为您的数据库结构和数据存在一些问题。如果您有一个类别表,则不应对不同的类别名称重复进行catid。如果包含用于创建相关表的代码,可能有助于更好地处理数据库的实际结构。