Oracle - 如何从输出中替换和求和?

Oracle - how to replace and sum from the output?

我有如下分组输出。

SELECT param2,count(*) FROM table WHERE CALLED='1234' GROUP BY PARAM2 

Param2                      count(*)  
135;                          616  
135;135;                       18  
135;135;135;                    4  
135;135;135;135;                2  
135;135;135;135;135;135;27;    15      
135;135;135;27;                 5  
136;                           43  
136;136;                      383  
136;136;136;                   47    
136;136;136;27;                32  

预期:对于所有包含 135 或 136 的输出 param2 应再次分组,结果应如下所示:

Param2     count(*)  
135        660    
136        505  

对于给定的示例,一个简单的 straight-forward 解决方案就可以完成这项工作。不确定这是否具有必要的一般性:

select '135' as "Param2", count(*) from table
  where called = '1234' and ';'||param2 like '%;135;%'
union all
select '136' as "Param2", count(*) from table
  where called = '1234' and ';'||param2 like '%;136;%'

试试下面的查询,

将我的基本源保留为您提到的输出,我们可以使用传统的 regular expression 拆分行并获得 param2distinct 值,然后是 sum 在它上面会给出预期的结果。我不太怀疑性能如何,但你可以试一试。

带有示例数据:

with table1
as
(
select '135;' param2, 616 cnt from dual union all
select '135;135;', 18 from dual union all
select '135;135;135;', 4 from dual union all 
select '135;135;135;135;', 2 from dual union all
select '135;135;135;135;135;135;27;', 15 from dual union all      
select '135;135;135;27;', 5 from dual union all
select '136;', 43 from dual union all
select '136;136;', 383 from dual union all  
select '136;136;136;', 47 from dual union all 
select '136;136;136;27;', 32 from dual
)
select split,sum(cnt) cnt
  from 
    (select distinct t1.*, regexp_substr(param2,'[^;]+', 1, level) split
       from table1 t1;
     connect by regexp_substr(param2, '[^;]+', 1, level) is not null)
group by split;

所以最终的查询应该是,

with table1 
as
(
 select param2, count(*) cnt 
   from table 
  where called = '1234' 
 group by param2
)
select split as param2,sum(cnt) cnt
  from 
    (select distinct t1.*, regexp_substr(param2,'[^;]+', 1, level) split
       from table1 t1;
     connect by regexp_substr(param2, '[^;]+', 1, level) is not null)
group by split;