SQL Group由一列组成,在另一列中计数条目

时间:2011-06-26 16:07:33

标签: sql sqlite count group-by

我正在使用sqlite3数据库,其中包含这样的表格。

|name   |action     |
-------------------------
|john   |run        |
|jim    |run        |
|john   |run        |
|john   |jump       |
|jim    |jump       |
|jim    |jump       |
|jim    |dive       |

我希望得到像这样的输出

|name   |run    |jump   |dive   |
---------------------------------
|john   |2  |1  |0  |
|jim    |1  |2  |1  |

我最接近的就是这个,但我希望像上面那样有一行。

SELECT name, action, COUNT(name)
FROM table
GROUP BY name, action

|name   |action |COUNT(name)    |
|john   |run    |2      |
|john   |jump   |1      |
|jim    |run    |1      |
|jim    |jump   |2      |
|jim    |dive   |1      |

此外,我还需要在查询中包含一些WHERE语句。

我觉得这会起作用吗?

4 个答案:

答案 0 :(得分:2)

您还可以使用sum aggregate和CASE条件来完成您想要的任务:

SELECT name, 
       sum(CASE WHEN action = 'run' THEN 1 END) as run,
       sum(CASE WHEN action = 'jump' THEN 1 END) as jump,
       sum(CASE WHEN action = 'dive' THEN 1 END) as dive
FROM table
GROUP BY name

每次添加其他操作时,您仍需要更改查询。

答案 1 :(得分:1)

我不太了解SQLLite,但我认为您可以使用子查询或临时表。 使用mssql,您可以编写如下内容:

select Name, 
     (select count(*) from table as t1 where t1.Name = table.Name and t1.Action = 'run') as Run, 
(select count(*) from table as t1 where t1.Name = table.Name and t1.Action = 'dive') as dive, 
(select count(*) from table as t1 where t1.Name = table.Name and t1.Action = 'jump') as run
 from table 

但是每次你使用其他动作类型时都需要重写。你应该添加一个索引来提高表的速度。但首先使用“真实”数据检查查询计划。

答案 2 :(得分:1)

您要做的是cross tabulation。通常,这可以作为Excel和其他电子表格软件中称为数据透视表的功能使用。

我找到了一篇博客文章,可以帮助您使用SQL。查看pivot-table-hack-in-sqlite3-and-mysql

答案 3 :(得分:1)

在oracle数据库中,您可以像下面的查询一样编写以显示所需的解决方案: -

select * from table_name
pivot (count(*) for action in ('run','jump','drive'))

这将提供所需的输出..