[英]SQL Group by one column, count entries in another
我正在使用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语句。
我在夜里认为这会起作用吗?
您还可以使用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
每次添加其他操作时,您仍然需要更改查询。
我不太了解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
但是每次你使用其他动作类型时都需要重写。 你应该添加一个索引来提高表的速度。 但首先使用“真实”数据检查查询计划。
你要做的是称为交叉制表 。 通常,这可以作为Excel和其他电子表格软件中称为数据透视表的功能使用。
我发现了一篇博客文章,可以帮助您使用SQL。 查看pivot-table-hack-in-sqlite3-and-mysql
在oracle数据库中,你可以编写如下查询来显示所需的解决方案: -
select * from table_name
pivot (count(*) for action in ('run','jump','drive'))
这将给出所需的输出..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.