Oracle中 列轉行、多行變單行函式 listagg()
阿新 • • 發佈:2020-02-25
在工作中偶爾需要將多行資料轉換成一行顯示,由於不經常使用,故此處記錄一下方便下次檢視
listagg(expr1,expr2) within group(order by expr3)
expr1:需要進行轉換的列,可以單列也可以是多列
expr2:列與列之間的分隔符,比如逗號(,)、分號(;)等等
expr3:排序列
接下來官網的示例說明
需求一:彙總列出了hr.employees表中部門ID=30中的所有員工,並按僱用日期和姓名排序:
SELECT LISTAGG(last_name,'; ') WITHIN GROUP (ORDER BY hire_date,last_name) "所有員工",MIN(hire_date) "最小僱傭日期" FROM employees WHERE department_id = 30; 所有員工 最小僱傭日期 ------------------------------------------------------------ --------- Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares 2020-02-25
需求二:以組集合彙總示例針對hr.employees表中的每個部門ID ,按其僱用日期的順序列出了該部門中的員工:
SELECT department_id "部門.",LISTAGG(last_name,'; ') WITHIN GROUP (ORDER BY hire_date) "部門下的所有員工" FROM employees GROUP BY department_id ORDER BY department_id; 部門. 部門下的所有員工 ------ ------------------------------------------------------------ 10 Whalen 20 Hartstein; Fay 30 Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares 40 Mavris 50 Kaufling; Ladwig; Rajs; Sarchand; Bell; Mallin; Weiss; Davie s; Marlow; Bull; Everett; Fripp; Chung; Nayer; Dilly; Bissot ; Vollman; Stiles; Atkinson; Taylor; Seo; Fleaur; Matos; Pat el; Walsh; Feeney; Dellinger; McCain; Vargas; Gates; Rogers; Mikkilineni; Landry; Cabrio; Jones; Olson; OConnell; Sulliv an; Mourgos; Gee; Perkins; Grant; Geoni; Philtanker; Markle 60 Austin; Hunold; Pataballa; Lorentz; Ernst 70 Baer . . .
需求三:以下示例與上一示例相同,不同之處在於它包含該ON OVERFLOW TRUNCATE子句。出於本示例的目的,假定返回值的最大長度是人為的200位元組的小數字。由於部門50的員工列表超過200個位元組,因此該列表被截斷並附加了最終定界符’ ;’,指定的截斷指示符’ …‘和截斷值的數量’ (23)’。
SELECT department_id "部門.",'; ' ON OVERFLOW TRUNCATE '...') WITHIN GROUP (ORDER BY hire_date) "部門下的所有員工" FROM employees GROUP BY department_id ORDER BY department_id; 部門. 部門下的所有員工 ------ ------------------------------------------------------------ 10 Whalen 20 Hartstein; Fay 30 Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares 40 Mavris 50 Kaufling; Ladwig; Rajs; Sarchand; Bell; Mallin; Weiss; Davie s; Marlow; Bull; Everett; Fripp; Chung; Nayer; Dilly; Bissot ; Vollman; Stiles; Atkinson; Taylor; Seo; Fleaur; ... (23) 70 Baer . . .
需求四:分析示例,對於2003年9月1日之前僱用的每個員工,該員工的部門,僱用日期以及該部門中的所有其他員工也在2003年9月1日之前僱用
SELECT department_id "部門",hire_date "僱傭日期",last_name "員工",'; ') WITHIN GROUP (ORDER BY hire_date,last_name)
OVER (PARTITION BY department_id) as "其他員工"
FROM employees
WHERE hire_date < '01-SEP-2003'
ORDER BY "Dept","Date","Name";
部門 僱傭日期 員工 其他員工
----- --------- --------------- ---------------------------------------------
30 07-DEC-02 Raphaely Raphaely; Khoo
30 18-MAY-03 Khoo Raphaely; Khoo
40 07-JUN-02 Mavris Mavris
50 01-MAY-03 Kaufling Kaufling; Ladwig
50 14-JUL-03 Ladwig Kaufling; Ladwig
70 07-JUN-02 Baer Baer
90 13-JAN-01 De Haan De Haan; King
90 17-JUN-03 King De Haan; King
100 16-AUG-02 Faviet Faviet; Greenberg
100 17-AUG-02 Greenberg Faviet; Greenberg
110 07-JUN-02 Gietz Gietz; Higgins
110 07-JUN-02 Higgins Gietz; Higgins