计算oracle中每一行的出现次数table

Counting the number of occurences for each row in oracle table

我有一个 table 有两列 name 和 disease ,我想计算在 table 中发现每种疾病的次数,例如

------------------------
name       | disease   |
------------------------
name1      | a         |
------------------------
name2      | b         |
------------------------
name3      | c         |
------------------------
name4      | a , b , d |
------------------------

我正在寻找能给我这样结​​果的查询,是否可能?我尝试了很多查询,其中 none 以我想要的方式工作

------------------------
a          |  2        |
------------------------
b          |  2        |
------------------------
c          |  1        |
------------------------
d          |  1        |
-----------------------
WITH TEST_TABE AS (
SELECT 'name1' as name, 'a' AS disease FROM DUAL
UNION
SELECT 'name2' as name, 'b' AS disease FROM DUAL
UNION
SELECT 'name3' as name, 'c' AS disease FROM DUAL
UNION
SELECT 'name4' as name, 'a , b , d' AS disease FROM DUAL
)
SELECT 
    SUM(CASE WHEN INSTR(disease, 'a') != 0 THEN 1 END) AS "A",
    SUM(CASE WHEN INSTR(disease, 'b') != 0 THEN 1 END) AS "B",
    SUM(CASE WHEN INSTR(disease, 'c') != 0 THEN 1 END) AS "C",
    SUM(CASE WHEN INSTR(disease, 'd') != 0 THEN 1 END) AS "D"
FROM TEST_TABE;

结果:

A   B   C   D
2   2   1   1

阅读代码内的评论:

SQL> with test as
  2    -- sample data
  3   (select 'name1' as name, 'a' as disease from dual union all
  4    select 'name2' as name, 'b' as disease from dual union all
  5    select 'name3' as name, 'c' as disease from dual union all
  6    select 'name4' as name, 'a , b , d' as disease from dual
  7   ),
  8  splt as
  9   -- split the DISEASE column to rows
 10   (select name,
 11      trim(regexp_substr(disease, '[^,]+', 1, column_value)) disease
 12    from test cross
 13    join table(cast(multiset(select level from dual
 14                             connect by level <= regexp_count(disease, ',') + 1
 15                            ) as sys.odcinumberlist))
 16   )
 17  -- finally ...
 18  select disease,
 19         count(*) num
 20  from splt
 21  group by disease
 22  order by disease;

DISEASE           NUM
---------- ----------
a                   2
b                   2
c                   1
d                   1

SQL>