Oracle的分条件计数COUNT(我的条件),由浅入深

摘要:
@目录本文涉及关键字COUNT、CASEWHEN和DECODE。Oracle COUNT内置函数。复杂计数。常规操作。中间操作。对中间操作的反思。高级操作。高级操作的修订版本。(你需要根据你的业务知识灵活轮换。)总结。本文涉及关键字COUNT、CASEWHEN和DECODE。Oracle计数。所有操作都基于下表作为操作对象。创建一个名为sqlcreatetableCUSTOMER_ GROUP_MEMB的表

@

目录
本文涉及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 ||

免责声明:文章转载自《Oracle的分条件计数COUNT(我的条件),由浅入深》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇一些替代Xshell的软件推荐微信公众号平台开发(三):几大微信接口的调用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

oracle下如何执行一个本地的.sql脚本文件

分析: 我们通常在开发过程中会遇到很多程序修改或者批量修改数据的时候,会选择脚本的文件的形式通过命令来执行,那么怎么用plsql或者sqlplus执行sql脚本文件呢? 说明: 如果说现在在c盘盘符下放置了一个我们需要执行的create.sql脚本文件,如果说用sqlplus去执行这个脚本文件: 1、进入到运行命令窗口。 2、登录sqlplus conne...

Oracle DBCA工具检测不到ASM磁盘组

本例环境: 操作系统OEL 6.5 数据库版本:11.2.0.4 问题:DBCA建库的时候,检测不到ASM磁盘组   因素一:可能是在授权的时候执行了 chown –R 775 /u01/app等修改权限。 分析:数据库无法连接ASM,这应该是权限问题,grid的$ORACLE_BASE是/u01/app/grid,oracle的$ORACLE_BASE是...

Oracle RAC 集群环境下日志文件结构

Oracle RAC 集群环境下日志文件结构 在Oracle RAC环境中,对集群中的日志的定期检查是必不可少的。通过查看集群日志,可以早期定位集群环境中出现的问题,以便将问题消灭在萌芽状态。简单介绍一下有关Oracle集群环境中日志的结构,方便快速查找所需的日志文件。 1.Oracle集群日志藏匿之处 Orac 在Oracle RAC环境中,对集群中...

oradebug 的学习 一

    说明 oradebug主要是给oracle支持人员使用的,尽管很早便有,但oracle官网很少有记载。他是个sql*plus命令行工具,有sysdba的权限就可以登入,无需特别设置。他可以被用于: 1)追踪进程,或者是你的,或者是外部的 2)确定进程往哪个trc文件写 3)转储:数据文件头、内部oracle结构等 4)挂起进程,暂时的...

[Oracle]

My Oralce Linux 6.5 is running on VirtualBox. Basic settings is 4G memory, 50G hard-disk, auto partition when install OL6.5. ** Following series of operations need root privilege...

Oracle【多表查询操作(SQL92&SQL99)】

多表联合查询:需要获取的数据分布在多张表中 SQL92: 1 --笛卡尔积:将多个表的数据进行一一对应,所得的结果为多表的笛卡尔积 2 select * from emp; 3 select * from dept; 4 select * from emp,dept;--进行全排列 14*5=70 1 --等值连接:先笛卡尔积,然后筛选,筛选条件为等值...