部门,count(distinct case when)分组后得到结果不对,偏大是怎么回事呢,怎么解决呢
比如,要统计所有班级姓李的同学和姓王的同学的人数,SQL应该怎样写呢?
以李姓同学的统计为例,我将名字以"李"开头的同学进行计数,其他汉字开头的记录为null即可。注意,这里的else语句中如果写成0将会把其他的类型也加入到计数中。以下是我的SQL:
--统计所有班级中姓李的和姓王的同学个数
select count(case when name like '李%' then name else null end) as li_cnt,count(case when name like '王%' then name else null end) as wa_cnt from student;
结果如下,李姓的同学有5个,王姓的同学有3个,跟预期相符:
其实,这里的else语句可以省略掉,没有else如果不满足条件的话也会以null进行填充。
--不写else也可以得出正确的结果
select count(case when name like '李%' then name end) as li_cnt,count(case when name like '王%' then name end) as wa_cnt from student;
对于该问题,可能的原因是在统计时,count(distinct case when)的逻辑有误,导致统计出的结果偏大。解决方法可以从以下几个方面入手:
1.检查SQL语句中的count(distinct case when)语句是否正确,是否把多余的数据也计算进去了。可以用一些数据抽样工具对结果进行抽样统计,查看其中异常数据,进一步确认问题。
2.检查数据源是否存在问题。可能是数据源中存在重复数据,导致统计时出现误差。通过检查数据源,排除数据源本身的问题。
3.如果数据源确定无误,可以考虑使用其他的统计方法进行替代。例如使用子查询或者临时表进行统计,避免使用复杂的count(distinct case when)语句,进一步提高统计准确性。
具体的实现过程需要根据具体情况进行调整,以下是一个基础的SQL语句示例,用于检查count(distinct)的结果是否正确:
-- 检查count(distinct)的结果是否正确 select count(*), count(distinct department_id) from employees;
该语句可以统计出employees表中department_id的数量及其中不重复的部门数量,检查结果是否符合预期。