COUNT()
总览介绍
本文涉及COUNT 、CASE WHEN 、DECODE
介绍的关键字Oracle-COUNT
内置函数
复杂计数
常规操作
中级操作
中级操作的反思
高级操作
高级操作修正版本(需要你根据自己的业务知识灵活转动)
总结
本文涉及COUNT 、CASE WHEN 、DECODE
介绍的关键字Oracle-COUNT
一下所有的操作都吧下面的这张表做为操作对象
建表sql
create table CUSTOMER_GROUP_MEMBER_LIST
	(
	  CUSTOMER_GROUP_ID NUMBER(8)           not null,
	  MEMBER_MSISDN     NUMBER(15)          not null,
	  IS_VALID          NUMBER(1) default 9 not null,
	  INVALID_CAUSE     NUMBER(1),
	  CREATE_TIME       DATE,
	  CREATE_OPER_ID    VARCHAR2(64),
	  constraint PK_GROUP_MEMBER_LIST
	  primary key (CUSTOMER_GROUP_ID, MEMBER_MSISDN)
	)
1
2
3
4
5
6
7
8
9
10
11
预览信息
内置函数
COUNT常规用法
	SELECT COUNT(*) FROM CUSTOMER_GROUP_MEMBER_LIST
	或者可以使用
	SELECT COUNT(1) FROM CUSTOMER_GROUP_MEMBER_LIST
	在或者
	SELECT COUNT(IS_VALID) FROM CUSTOMER_GROUP_MEMBER_LIST (某个字段)
1
2
3
4
5
复杂计数
常规操作
在此之前你需要知道:count(数据库字段) 不会讲数据库字段中的数据是null的进行COUNT计算
要求:
统计IS_VALID 为1的数据总数
统计IS_VALID 为0的数据总数
统计IS_VALID为0且INVALID_CAUSE为1的数据
统计IS_VALID为0且INVALID_CAUSE为2的数据
统计IS_VALID为0且INVALID_CAUSE为3的数据
SELECT * FROM
	(SELECT COUNT(1) COUNTONE FROM CUSTOMER_GROUP_MEMBER_LIST WHERE IS_VALID = 0) CASEONE,
	(SELECT COUNT(1) COUNTTWO FROM CUSTOMER_GROUP_MEMBER_LIST WHERE IS_VALID = 1) CASETWO,
	(SELECT COUNT(1) COUNTTHREE FROM CUSTOMER_GROUP_MEMBER_LIST WHERE IS_VALID = 0 AND INVALID_CAUSE = 1) CASETHREE,
	(SELECT COUNT(1) COUNTTOUR FROM CUSTOMER_GROUP_MEMBER_LIST WHERE IS_VALID = 0 AND INVALID_CAUSE = 2) CASEFOUR,
	(SELECT COUNT(1) COUNTFIVE FROM CUSTOMER_GROUP_MEMBER_LIST WHERE IS_VALID = 0 AND INVALID_CAUSE = 3) CASEFIVE
1
2
3
4
5
6
展示效果
中级操作
在此之前你需要知道:case when的使用 类似在count函数中动态追加条件
--简单Case函数  
	CASE sex  
	WHEN '1' THEN '男'  
	WHEN '2' THEN '女'  
	ELSE '其他' END  
--Case搜索函数  
	CASE WHEN sex = '1' THEN '男'  
	WHEN sex = '2' THEN '女'  
	ELSE '其他' END
1
2
3
4
5
6
7
8
9
因此上面的可以改写为
SELECT
       COUNT(CASE IS_VALID WHEN 0 THEN 1 ELSE NULL END) COUNTONE,
       COUNT(CASE IS_VALID WHEN 1 THEN 1 ELSE NULL END) COUNTTWO,
       COUNT(CASE IS_VALID WHEN 0 THEN CASE INVALID_CAUSE WHEN 1 THEN 1 ELSE NULL END ELSE NULL END) COUNTTHREE,
       COUNT(CASE IS_VALID WHEN 0 THEN CASE INVALID_CAUSE WHEN 2 THEN 1 ELSE NULL END ELSE NULL END) COUNTTOUR,
       COUNT(CASE IS_VALID WHEN 0 THEN CASE INVALID_CAUSE WHEN 3 THEN 1 ELSE NULL END ELSE NULL END) COUNTFIVE
FROM CUSTOMER_GROUP_MEMBER_LIST
1
2
3
4
5
6
7
展示效果
中级操作的反思
内置case when的两次判断方法
虽然比基础操作代码量有所精简,但是变得比较难理解
如果有更加复杂的逻辑判断,会导致逻辑代码修改起来崩溃
高级操作
入门函数DECODE
具体的使用介绍可以在https://jingyan.baidu.com/article/c45ad29cf08673051753e28b.html找到,简单来说就是decode对于case when做出了更多的处理,支持将制定字段进行处理之后的case when操作
demo 
	decode(sign(score-70),1,'良好',0,'良好',-1,
1
2
因此进一步操作
SELECT
       COUNT(DECODE(CGML.IS_VALID, 1, 1, NULL)) VALID_COUNT,
       COUNT(DECODE(CGML.IS_VALID, 0, 1, NULL)) INVALID_COUNT,
       COUNT(DECODE(CGML.IS_VALID || CGML.INVALID_CAUSE, 01 , 1, NULL)) FEMOBILE_COUNT,
       COUNT(DECODE(CGML.IS_VALID || CGML.INVALID_CAUSE, 02 , 1, NULL)) INCREET_COUNT,
       COUNT(DECODE(CGML.IS_VALID || CGML.INVALID_CAUSE, 03 , 1, NULL)) NOTEXIST_COUNT
FROM CUSTOMER_GROUP_MEMBER_LIST CGML
1
2
3
4
5
6
7
查看结果,然而结果并不对 心凉了
- 问题出现的原因
null和数字的拼接之后的数据进行判断出问题了 01 并不是按照字符的方式进行判断的
因此我这里对于筛选的结果再次进行了验证
更加直观的展示结果
转而使用字符串的方式
高级操作修正版本(需要你根据自己的业务知识灵活转动)
修正版本的sql
SELECT COUNT(1) TOTAL,
       COUNT(DECODE(CGML.IS_VALID, 1, 1, NULL)) VALID_COUNT,
       COUNT(DECODE(CGML.IS_VALID, 0, 1, NULL)) INVALID_COUNT,
       COUNT(DECODE(TO_CHAR(CGML.IS_VALID || CGML.INVALID_CAUSE), '01' , 1, NULL)) FEMOBILE_COUNT,
       COUNT(DECODE(TO_CHAR(CGML.IS_VALID || CGML.INVALID_CAUSE), '02' , 1, NULL)) INCREET_COUNT,
       COUNT(DECODE(TO_CHAR(CGML.IS_VALID || CGML.INVALID_CAUSE), '03' , 1, NULL)) NOTEXIST_COUNT
FROM CUSTOMER_GROUP_MEMBER_LIST CGML
1
2
3
4
5
6
7
sql效果展示
总结
骚操作可以有 但是一定要量力而行
关键词汇 count case when decode to_char ||
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号