工作中遇到这样一个需求
对一张全量表的统计 其中后面的隐患分布 实际是一个字段的多种不同值 要统计各种类型的数量。
假如有下面一张表
ID | TYPE |
---|---|
1 | 1 |
1 | 2 |
1 | 1 |
1 | 1 |
1 | 4 |
1 | 1 |
1 | 2 |
2 | 5 |
2 | 6 |
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 命令来执行语句。