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

您所在的位置:网站首页 go英文是什么意思是什么 Oracle的分条件计数COUNT(我的条件),由浅入深

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

2023-08-31 15:53| 来源: 网络整理| 查看: 265

总览介绍 本文涉及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) ) 预览信息 在这里插入图片描述 内置函数 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 ||


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3