繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM