Oracle數(shù)據(jù)庫如何將表的某一列所有值用逗號隔開去重后合并成一行
一、背景
最近在工作中,有個需求是要求在oracle統(tǒng)計查詢的時候,將表的某一列的所有值用逗號隔開,去重后合并成一行。于是研究了一下listagg和xmlagg 函數(shù) 用來合并數(shù)據(jù)
以下通過實例說明。
二、方法
1.不去重的兩種方法
listagg函數(shù)
返回結果為varchar2格式的數(shù)據(jù),即拼接后的字符串最大可以保存4000字節(jié)的數(shù)據(jù),所以大于這個數(shù)據(jù)的字符串就會報ORA-01489 字符串連接的結果過長的錯誤。
xmlagg函數(shù)
當查詢結果過長,拼接的字符串長度過長大于4000字節(jié),我們可以使用這個函數(shù),函數(shù)返回結果為CLOB類型,大對象數(shù)據(jù)類型最大可以存儲4GB的數(shù)據(jù)長度。
用法1:用某符號拼接列中所有值
SELECT
LISTAGG(student_name, ',') WITHIN GROUP(ORDER BY student_name) listagg
FROM
student_info t;
執(zhí)行結果:
| listagg |
| 王一,陳二,張三,李四 |
用法2:按某列 分組,用指定符號拼接組內(nèi)列中所有值
//方法1 LISTAGG
SELECT
t.student_name,t.student_sex
LISTAGG(student_name, ',') WITHIN GROUP(ORDER BY student_name)
OVER( PARTITION BY student_sex)
listagg
FROM
student_info t;
//方法2 xmlagg
SELECT
xmlagg(xmlparse(content t.student_name || ',' WELLFORMED) order by t.student_name).getClobval()
listagg
FROM
student_info t;執(zhí)行結果:
| student_name | student_sex | listagg |
| 王一 | 女 | 王一,陳二 |
| 陳二 | 女 | 王一,陳二 |
| 張三 | 男 | 張三,李四 |
| 李四 | 男 | 張三,李四 |
2.去重的方法
數(shù)據(jù)表
| 創(chuàng)建日期 | 公司代碼 | 銷售物品 |
| 20230718085055 | 111 | 蘋果 |
| 20230718085055 | 111 | 香蕉 |
| 20230718090000 | 111 | 蘋果 |
| 20230718090000 | 112 | 牙刷 |
| 20230718090000 | 112 | 牙刷 |
若不去重則顯示數(shù)據(jù)為
| 公司代碼 | 銷售物品 |
| 111 | 蘋果,香蕉,蘋果 |
| 112 | 牙刷,牙刷 |
有多種去重方法,這邊建議先去重再聚合
//distinct去重后,再聚合 拼接
select
t.company_code ,LISTAGG(t.sale_name, ',') within group (
order by t.sale_name) OVER(PARTITION BY t.company_code ) LISTAGG
from
(
select
distinct s.sale_name,
s.company_code
from
sale_info s
) t 執(zhí)行結果:
| company_code | LISTAGG |
| 111 | 蘋果,香蕉 |
| 112 | 牙刷 |
以上即為本人項目中的處理思路,若有幫助到你,那真的太好了!
總結
到此這篇關于Oracle數(shù)據(jù)庫如何將表的某一列所有值用逗號隔開去重后合并成一行的文章就介紹到這了,更多相關Oracle列值用逗號隔開去重后合并內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Oracle中使用DBMS_XPLAN處理執(zhí)行計劃詳解
這篇文章主要介紹了Oracle中使用DBMS_XPLAN處理執(zhí)行計劃詳解,文中包含大量實例,以及set autotrace命令對應實現(xiàn)等內(nèi)容,需要的朋友可以參考下2014-07-07
Oracle設置時區(qū)和系統(tǒng)時間的多種實現(xiàn)方法
在Oracle數(shù)據(jù)庫中,設置時區(qū)和系統(tǒng)時間可以通過多種方法實現(xiàn),本文通過代碼示例給大家介紹了Oracle設置時區(qū)和系統(tǒng)時間的多種實現(xiàn)方法,需要的朋友可以參考下2024-02-02

