我正在使用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语句。
我觉得这会起作用吗?
答案 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'))
这将提供所需的输出..