oracle分种类计数,要求写一个汇总列表,是统计每个分类下的个数,以及每个分类下有效的个数...

例子数据是这样的

ID                  STATUS                  TYPE

1                       0                         'A'

2                       1                         'A'

3                       0                         'A'

4                       1                         'B'

5                       1                         'B'

6                       0                         'B'

要求是统计每个分类下面的记录条数,以及每个分类下面有效(status=1)的记录条数

汇总列表字段要求

TYPE, 分类总记录数,分类记录有效数

---------------------------------------------------------------

下面是我的实现方法,想问一下有没有其他省力的方法

方法一:

WITH TMP AS(SELECT 1 ID,0 STATUS,'A' TYPE FROM DUAL UNION ALL

SELECT 2,1,'A' FROM DUAL UNION ALL

SELECT 3,0,'A' FROM DUAL UNION ALL

SELECT 4,1,'B' FROM DUAL UNION ALL

SELECT 5,1,'B' FROM DUAL UNION ALL

SELECT 6,0,'B' FROM DUAL)

SELECT TYPE,SUM(1) 记录总数,SUM(CASE WHEN STATUS=0 THEN 0 ELSE 1 END)记录有效数

FROM TMP GROUP BY TYPE;

方法二:

WITH TMP AS(SELECT 1 ID,0 STATUS,'A' TYPE FROM DUAL UNION ALL

SELECT 2,1,'A' FROM DUAL UNION ALL

SELECT 3,0,'A' FROM DUAL UNION ALL

SELECT 4,1,'B' FROM DUAL UNION ALL

SELECT 5,1,'B' FROM DUAL UNION ALL

SELECT 6,0,'B' FROM DUAL),

TMP2 AS(SELECT NVL(STATUS,3) S,TYPE,COUNT(ID) CNT FROM TMP GROUP BY CUBE(P,T)),

TMP3 AS(SELECT * FROM TMP2 PIVOT(MAX(CNT) FOR S IN(3 AS ZS,0 AS WX,1 AS YX)))

SELECT TYPE,ZS,YX FROM TMP3 WHERE P IS NOT NULL;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值