您的位置:首页 > 其它

group后count中既包含字段(可DISTINCT去重)又包含条件过滤

2017-02-17 17:33 453 查看

分组后count中既包含字段又包含条件过滤

情景

假如用户表join另一个表后获得如下内容(每个用户可以有多个card,每个card有个card_type属性),别名为t

uidcard_typecard
11aaa
11bbb
10ccc
21ddd

常用聚合:

每个用户的card数量:

select t.uid, COUNT(t.card)	from t group by t.uid
select t.uid, COUNT(*) from t group by t.uid


每个用户card_type为1的card数量(COUNT不计null值) 。缺点:只能汇总card_type=1

select t.uid, COUNT(t.card) from t where t.card_type=1 group by t.uid

select t1.uid, COUNT(t1.card) from ( select * from t group by t.uid
) t1 group by t1.id, t1.card_type

select uid, COUNT(card_type=1 or null) from t group by uid

根据字段(可去重)和条件COUNT

每个每种card_type的card数量和所有类型card_type的card数量

此时汇总的字段为card,但是一个需要有card_type条件,一个不需要

上面汇总的方法就不适用了,就必须拆分为第1种和第2种两个sql查询。不再多说

下面列举一些单条sql的实现

select t.uid, COUNT(t.card), COUNT(if(t.card_type=1, t.card,null)) from t group by uid

select t.uid, COUNT(t.card), COUNT(CASE WHEN t.card_type=1 THEN t.card ELSE null)
from t group by uid

甚至可以对选择汇总的字段card去重计数

COUNT( DISTINCT if(t.card_type=1, t.card,null) )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐