我有下表:
A V
- -
A1 B, C
A2 C, 2W
A3 D
A4 10K, 10W, 2A
我想计算 V 中的值并按出现次数排序。预期输出:
O COUNT(*)
- -------
W 12
K 10
A 2
C 2
B 1
D 1
答案 0 :(得分:2)
您可以将 REGEX_SUBSTR()
和 REGEXP_REPLACE()
函数与分层查询结合使用,假设所有以逗号分隔的元素,无论何时修剪空格,都是 正整数形式+ 一个字母,例如
WITH t2 AS
(
SELECT TRIM(REGEXP_SUBSTR(v,'[^,]+',1,level)) AS v
FROM t
CONNECT BY level <= REGEXP_COUNT(v,',')+1
AND PRIOR SYS_GUID() IS NOT NULL
AND PRIOR a = a
)
SELECT NVL(SUM(REGEXP_REPLACE(v,'[^[:digit:]]')),
CASE WHEN COUNT(*)>1 THEN COUNT(*) END)||REGEXP_REPLACE(v,'[^[:alpha:]]') AS o
FROM t2
GROUP BY REGEXP_REPLACE(v,'[^[:alpha:]]')
编辑(取决于问题的最后编辑):只需删除连接运算符,并为 COUNT
聚合设置条件,例如
SELECT REGEXP_REPLACE(v,'[^[:alpha:]]') AS o,
NVL(SUM(REGEXP_REPLACE(v,'[^[:digit:]]')),COUNT(*)) AS count
FROM t2
GROUP BY REGEXP_REPLACE(v,'[^[:alpha:]]')
ORDER BY count DESC, o