SQL实现按单字段分组 统计另一字段不同值的分类计数
解决方案
这类分组后按字段不同取值在同一行输出多列计数的需求,用条件聚合实现即可,不需要联合usr_id分组,也不需要做表关联,执行效率很高。
直接运行下面的SQL就能得到你要的结果:
SELECT ts, COUNT(CASE WHEN usr_id = 'A' THEN 1 END) AS `A的计数`, COUNT(CASE WHEN usr_id = 'B' THEN 1 END) AS `B的计数`, COUNT(CASE WHEN usr_id NOT IN ('A', 'B') THEN 1 END) AS `其他用户的计数` FROM myTable GROUP BY ts;
实现逻辑说明
- 分组维度只保留
ts即可,和你之前联合usr_id分组的逻辑区别是,我们不把usr_id作为分组依据,而是在聚合函数内部逐行判断usr_id的取值:- 统计A的计数时,只有usr_id等于'A'的记录才会被COUNT统计到,不符合条件的记录会返回NULL,COUNT会自动忽略NULL值
- 统计B的计数逻辑和A一致
- 统计其他用户计数时,把usr_id既不是A也不是B的记录纳入统计即可
- 这个写法是标准SQL语法,在所有支持SQL标准的数据库(MySQL、PostgreSQL、SQL Server等)都能正常运行,返回结果和你给出的预期完全一致。
如果你使用的是MySQL,还可以用更简洁的写法,因为MySQL中布尔判断的结果是1(成立)和0(不成立),直接用SUM求和就能得到对应计数,效果和上面的写法完全等价:
SELECT ts, SUM(usr_id = 'A') AS `A的计数`, SUM(usr_id = 'B') AS `B的计数`, SUM(usr_id NOT IN ('A', 'B')) AS `其他用户的计数` FROM myTable GROUP BY ts;
内容的提问来源于stack exchange,提问作者gunnersfan
相关产品推荐
相关产品推荐

