1. 程式人生 > 資料庫 >Oracle中 列轉行、多行變單行函式 listagg()

Oracle中 列轉行、多行變單行函式 listagg()

在工作中偶爾需要將多行資料轉換成一行顯示,由於不經常使用,故此處記錄一下方便下次檢視

 listagg(expr1,expr2) within group(order by expr3)

expr1:需要進行轉換的列,可以單列也可以是多列
expr2:列與列之間的分隔符,比如逗號(,)、分號(;)等等
expr3:排序列

接下來官網的示例說明

Oracle 官網關於listagg函式的說明

需求一:彙總列出了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