分组条件统计思路:聚合函数+case when
前言
最近有一个数据清洗的任务,其中需要分组条件统计某一个类别的数量后进行过滤,因为之前有看过类似场景的解决方案,后面决定使用聚合函数+case when来实现这个功能。
场景描述:
需要统计每个人有效手机的数量。我们很容易可以联想到,需要使用到group by 分组统计每个人的手机,但是怎么再加上限制条件“是否有效”呢?
这个时候可以考虑使用case when来解决,如果手机有效则为1,无效则为2
SELECT
T.u_name,
CASE
WHEN T.phone_status = 1 THEN
0 ELSE 1
END AS useful_phonecount
FROM
`user_test` T
GROUP BY
T.u_name;

这种解法有两个优点,第一是
灵活性,不管有效字段是通过什么来进行记录的(比如有T表示有效、F表示无效),case when都可以灵活的转换为数字。第二点是量化,将字段化作了可量化的数字,我们可以根据需求来制定满足条件的等式。
如果说需求变成了,统计手机全有效的用户昵称,那么我们可以通过:有效手机数量=用户手机数量 这个等式。这个时候聚合函数Sum()就可以上场了
SELECT
T.u_name
FROM
`user_test` T
GROUP BY
T.u_name
HAVING
SUM(CASE WHEN T.phone_status = 1 THEN 0 ELSE 1 END ) = COUNT( T.u_phone )
case when将数据变为量化的数值,sum函数实现统计,用公式来做条件判断,这样我们就可以很简单的实现复杂条件的数据筛选了。
浙公网安备 33010602011771号