SQL中实现类似Excel COUNTIF的筛选去重计数及行列转换方法
实现类似Excel COUNTIF的带筛选去重计数+行转列统计
要得到你想要的统计结果,需要同时完成两个核心操作:
- 给去重计数加筛选条件,实现类似Excel COUNTIF的效果
- 把GROUP BY生成的分组行结果,转换成按用户分组、各Case Type作为列的形式
直接可用的SQL代码
SELECT Case_Owner_Name__c AS Name, -- 统计Endorsement类型的去重Case #数量 COUNT(DISTINCT CASE WHEN Case_Type__c = 'Endorsement' THEN CaseNumber END) AS Endorsement, -- 统计Quote类型的去重Case #数量 COUNT(DISTINCT CASE WHEN Case_Type__c = 'Quote' THEN CaseNumber END) AS Quote, -- 统计Phone Call类型的去重Case #数量 COUNT(DISTINCT CASE WHEN Case_Type__c = 'Phone Call' THEN CaseNumber END) AS `Phone Call` FROM slss.case GROUP BY Case_Owner_Name__c;
代码逻辑说明
- 带筛选的去重计数:
- 用
CASE WHEN判断当前记录的Case Type是否符合目标类型,符合就保留CaseNumber,不符合就返回NULL COUNT(DISTINCT)会自动忽略NULL值,只对符合条件的非重复CaseNumber计数,完全实现了你要的“筛选后去重计数”需求
- 用
- 行转列处理:
- 每个Case Type单独写一条
COUNT(DISTINCT CASE...)语句,作为结果中的一列 - 最后按
Case_Owner_Name__c分组,就能得到每个用户对应各类型的统计数,没有对应类型的会自动显示0
- 每个Case Type单独写一条
额外提示
如果你的Case Type还有其他取值,直接照着现有格式新增对应的列就行。要是Case Type是动态变化的(比如随时会新增类型),不同数据库有对应的动态行转列方案(比如MySQL用预处理语句、PostgreSQL用crosstab、SQL Server用PIVOT),但针对你给出的固定类型场景,上面的静态写法最简单高效。
内容的提问来源于stack exchange,提问作者Jason Hendry
相关产品推荐
相关产品推荐

