计数值逗号分隔

时间:2021-06-01 13:50:55

标签: sql oracle

我有下表:

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

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:]]')    

Demo

编辑(取决于问题的最后编辑):只需删除连接运算符,并为 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

Demo