SQL Server查询求助:按案件统计展示所有用户(含无未结案件用户)
解决SQL Server统计用户未结案件数的问题
嘿,刚接触SQL Server遇到这种问题太正常啦,我来帮你搞定它!
首先看你的需求:要统计所有用户的未结案件数量,哪怕是没有未结案件的用户也要显示出来,但你写的查询只返回了有未结案件的用户,问题出在这几个地方:
原查询的问题
你的原代码:
select user_name,isnull(count(CASE_ID),'0') as case_id from users where CLOSE_DATE is NULL group by user_name
- 用了
WHERE CLOSE_DATE IS NULL,直接把已经结案的用户(比如User_ID=1的abc)过滤掉了,这些用户根本没进入分组统计,自然不会出现在结果里 count(CASE_ID)是数字类型,ISNULL的第二个参数用字符串'0'没必要,用数字0就好,不过这不是导致结果缺失的关键
修正后的正确查询
我们需要换个思路:不要过滤数据,而是在统计的时候判断案件是否未结,这样所有用户都会被包含进来。有两种常用写法:
方法1:用COUNT结合CASE表达式
SELECT User_Id, User_Name, COUNT(CASE WHEN Close_date IS NULL THEN Case_Id END) AS Case_Count FROM users GROUP BY User_Id, User_Name
方法2:用SUM结合CASE表达式
SELECT User_Id, User_Name, SUM(CASE WHEN Close_date IS NULL THEN 1 ELSE 0 END) AS Case_Count FROM users GROUP BY User_Id, User_Name
为什么这样能得到正确结果?
- 去掉
WHERE条件后,所有用户的记录都会被纳入分组计算 - 对于每个用户的案件:
- 如果
Close_date是NULL(未结案),CASE会返回有效内容(Case_Id或者1),会被COUNT/SUM统计进去 - 如果
Close_date不为NULL(已结案),CASE会返回NULL(COUNT会忽略)或者0(SUM会累加0),最终统计结果就是0
- 如果
- 这样不管用户有没有未结案件,都会出现在结果里啦
验证后的输出
执行上面的查询,就能得到你想要的结果:
User_ID User_Name Case_Count 1 abc 0 2 xyz 1 3 gst 1
内容的提问来源于stack exchange,提问作者Divya
相关产品推荐
相关产品推荐

