Oracle的分條件計數COUNT(個人條件),由淺入深

@(總覽介紹)sql

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

    內置函數

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

    中級操做

  • 在此以前你須要知道: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,

所以進一步操做htm

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 並非按照字符的方式進行判斷的
所以我這裏對於篩選的結果再次進行了驗證
更加直觀的展現結果
在這裏插入圖片描述blog

  • 轉而使用字符串的方式
    在這裏插入圖片描述

高級操做修正版本(須要你根據本身的業務知識靈活轉動)

  • 修正版本的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 ||
相關文章
相關標籤/搜索