计算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>
我有一个 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>