oracle listagg行转列操作实例

Oracle的LISTAGG函数可以将行数据合并为一个字符串,但如果要将行数据转换为列,可以使用PIVOT操作符。PIVOT操作符可以将行转换为列,并为每个列提供一个聚合函数。

假设有以下表格employee:

 EmployeeID | EmployeeName | Department
------------+-------------+------------
 1          | Alice       | Sales
 2          | Bob         | Marketing
 3          | Charlie     | Sales
 4          | David       | HR
 5          | Edward      | Marketing

如果要将Department列转换为列,可以使用以下语句:

SELECT * FROM (
  SELECT EmployeeName, Department FROM employee
)
PIVOT (
  COUNT(Department) FOR Department IN ('Sales' AS Sales, 'Marketing' AS Marketing, 'HR' AS HR)
);

在PIVOT操作符中,COUNT(Department)表示对Department列进行计数,'Sales' AS Sales表示将Sales列重命名为Sales,并将Sales列的值设置为'Sales','Marketing' AS Marketing和'HR' AS HR同理。 执行结果如下:

EMPLOYEENAME    SALES   MARKETING   HR
-------------   -----   ---------   --
Alice           1       0           0
Bob             0       1           0
Charlie         1       0           0
David           0       0           1
Edward          0       1           0

注意,使用PIVOT操作符时应该注意以下几点:

  1. PIVOT操作符只能在Oracle 11g及以上版本中使用。
  2. 在使用PIVOT操作符时,必须指定聚合函数,否则会出现ORA-56901错误。
  3. 在指定列名时,应该使用单引号将列名括起来。