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
拆分行并获得 param2
的 distinct
值,然后是 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;
我有如下分组输出。
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
拆分行并获得 param2
的 distinct
值,然后是 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;