oracle 类型分组计数,PIVOT操作,动态sql查询

工作中遇到这样一个需求

在这里插入图片描述
对一张全量表的统计 其中后面的隐患分布 实际是一个字段的多种不同值 要统计各种类型的数量。
假如有下面一张表

IDTYPE
11
12
11
11
14
11
12
25
26

1.计数

SELECT
  TYPE,
  COUNT(*) AS order_type_count
FROM
  TEMP
WHERE
  id = 1
GROUP BY
  TYPE;

得到
在这里插入图片描述

2需要得到的是转置之后的

oracle中 可以使用PIVOT

SELECT *
FROM (
  SELECT id, type
  FROM TEMP
  WHERE id = 1
)
PIVOT (
  COUNT(*)
  FOR TYPE IN ('1', '2', '4')
);

得到
在这里插入图片描述

3.假如我不知道类型有哪些

使用动态sql,对类型数组 以及查询的条件进行动态(本例子只关注类型数组)

DECLARE
  sql_stmt VARCHAR2(1000);
BEGIN
  SELECT
    'SELECT * FROM (SELECT id, type FROM temp WHERE id = 1) PIVOT (COUNT(*) FOR TYPE IN (' ||
    LISTAGG('''' || type || '''', ',') WITHIN GROUP (ORDER BY type) ||
    '))'
  INTO
    sql_stmt
  FROM
    (SELECT DISTINCT type FROM TEMP WHERE id = 1);

  EXECUTE IMMEDIATE sql_stmt;
END;

用上面sql 得到了一样的效果,请注意,由于这是一个动态查询,因此需要使用 EXECUTE IMMEDIATE 命令来执行语句。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值