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)
	)
  • 預覽信息
    在這裏插入圖片描述

內置函數

  • 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 (某個字段)

複雜計數

常規操作

  • 在此之前你需要知道: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
  • 展示效果
    在這裏插入圖片描述

中級操作

  • 在此之前你需要知道: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
  • 因此上面的可以改寫爲
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
  • 展示效果
    在這裏插入圖片描述

中級操作的反思

  • 內置case when的兩次判斷方法
  • 雖然比基礎操作代碼量有所精簡,但是變得比較難理解
  • 如果有更加複雜的邏輯判斷,會導致邏輯代碼修改起來崩潰

高級操作

  • 入門函數DECODE
    具體的使用介紹可以在https://jingyan.baidu.com/article/c45ad29cf08673051753e28b.html找到,簡單來說就是decode對於case when做出了更多的處理,支持將制定字段進行處理之後的case when操作
demo 
	decode(sign(score-70),1,'良好',0,'良好',-1,

因此進一步操作

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

查看結果,然而結果並不對 心涼了
在這裏插入圖片描述- 問題出現的原因
在這裏插入圖片描述

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
  • sql效果展示
    在這裏插入圖片描述

總結

  • 騷操作可以有 但是一定要量力而行
  • 關鍵詞彙 count case when decode to_char ||
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章