创建MYSQL表计算名称的多个类别

时间:2014-08-04 21:22:32

标签: mysql sql

我有两个表,一个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语句。

2 个答案:

答案 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小提琴来显示更改。

SQL FIDDLE

EDIT2 With ROLL UP

显示使用{{1}}与总计行的查询

答案 1 :(得分:0)

我认为您的数据库结构和数据存在一些问题。如果您有一个类别表,则不应对不同的类别名称重复进行catid。如果包含用于创建相关表的代码,可能有助于更好地处理数据库的实际结构。