【问题标题】:Counting the number of occurences for each row in oracle table计算oracle表中每一行的出现次数
【发布时间】:2020-06-29 04:40:19
【问题描述】:

我有一个包含两列 name 和 disease 的表,例如,我想计算在表中找到每种疾病的次数

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

我正在寻找一个可以给我这样的结果的查询,这可能吗?我尝试了很多查询,但没有一个按我想要的方式工作

------------------------
a          |  2        |
------------------------
b          |  2        |
------------------------
c          |  1        |
------------------------
d          |  1        |
-----------------------

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    在代码中读取 cmets:

    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>
    

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

      • 嗯......是的,但它不能扩展。如果疾病f 出现在表格中怎么办?您必须针对每个新疾病修改整个查询。
      • 如果有要求,OP 可以更新问题并否决这个答案。我认为这是一些课堂作业的一部分,因为该表甚至不是第一范式。疾病列不是原子的。如果这是用于生产数据库,祝你好运。
      猜你喜欢
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多