oracle—SQL技巧之(二)WMSYS.WM_CONCAT函数实现多行记录用逗号拼接在一起
程序员文章站
2023-10-22 22:15:10
需求: 目前接触bi系统,由于业务系统的交易记录有很多,常常有些主管需要看到所有的记录情况,但是又不想滚动,想一眼就可以看到所有的,于是就想到了字符串拼接的形式。 解决方案...
需求:
目前接触bi系统,由于业务系统的交易记录有很多,常常有些主管需要看到所有的记录情况,但是又不想滚动,想一眼就可以看到所有的,于是就想到了字符串拼接的形式。
解决方案:使用oracle自带的函数 wmsys.wm_concat,进行拼接。
函数限制:它的输出不能超过4000个字节。
为了不让sql出错,又可以满足业务的需求,超过4000个字节的部分,使用“。。。”
实现sql如下:
create table tmp_product
(product_type varchar2(255),
product_name varchar2(255));
insert into tmp_product
select 'a','producta'||rownum from dual
connect by level < 100
union all
select 'b','productb'||rownum from dual
connect by level < 300
union all
select 'c','productc'||rownum from dual
connect by level < 400
union all
select 'd','productd'||rownum from dual
connect by level < 500
union all
select 'e','producte'||rownum from dual
connect by level < 600;
select product_type,
wm_concat(product_name) || max(str) as product_multi_name
from (select product_type,
product_name,
case
when all_sum > 4000 then
'...'
else
null
end as str
from (select product_type,
product_name,
sum(vsize(product_name || ',')) over(partition by product_type) as all_sum,
sum(vsize(product_name || ',')) over(partition by product_type order by product_name) as up_sum
from tmp_product)
where (up_sum <= 3998 and all_sum > 4000)
or all_sum <= 4001)
group by product_type
目前接触bi系统,由于业务系统的交易记录有很多,常常有些主管需要看到所有的记录情况,但是又不想滚动,想一眼就可以看到所有的,于是就想到了字符串拼接的形式。
解决方案:使用oracle自带的函数 wmsys.wm_concat,进行拼接。
函数限制:它的输出不能超过4000个字节。
为了不让sql出错,又可以满足业务的需求,超过4000个字节的部分,使用“。。。”
实现sql如下:
复制代码 代码如下:
create table tmp_product
(product_type varchar2(255),
product_name varchar2(255));
insert into tmp_product
select 'a','producta'||rownum from dual
connect by level < 100
union all
select 'b','productb'||rownum from dual
connect by level < 300
union all
select 'c','productc'||rownum from dual
connect by level < 400
union all
select 'd','productd'||rownum from dual
connect by level < 500
union all
select 'e','producte'||rownum from dual
connect by level < 600;
复制代码 代码如下:
select product_type,
wm_concat(product_name) || max(str) as product_multi_name
from (select product_type,
product_name,
case
when all_sum > 4000 then
'...'
else
null
end as str
from (select product_type,
product_name,
sum(vsize(product_name || ',')) over(partition by product_type) as all_sum,
sum(vsize(product_name || ',')) over(partition by product_type order by product_name) as up_sum
from tmp_product)
where (up_sum <= 3998 and all_sum > 4000)
or all_sum <= 4001)
group by product_type
上一篇: 芒果酱的做法是什么?芒果酱可以怎么吃?
下一篇: 米醋和白醋的区别,你知道吗