Oracle 中实现行转列的方法有多种,以下介绍其中的两种方法:

  1. 使用 PIVOT 函数

PIVOT 函数是 Oracle 提供的一个用于行列转换的函数。它可以将行数据转换为列数据,同时进行汇总计算。以下是一个示例:

假设有一个员工表(EMP):

EMPNO  ENAME   JOB       SAL
-----  -----   -----   -----
7369   SMITH   CLERK     800
7499   ALLEN   SALESMAN  1600
7521   WARD    SALESMAN  1250
7566   JONES   MANAGER   2975
7654   MARTIN  SALESMAN  1250
7698   BLAKE   MANAGER   2850
7782   CLARK   MANAGER   2450

现在想要将该表中的 JOB 作为列,SAL 作为值进行转换,可以使用以下 SQL 语句:

SELECT *
FROM (
  SELECT ENAME, JOB, SAL FROM EMP
)
PIVOT (
  SUM(SAL)
  FOR JOB IN ('CLERK', 'SALESMAN', 'MANAGER')
);

执行该语句后,可以得到以下结果:

ENAME   'CLERK'  'SALESMAN'  'MANAGER'
-----   ------  ---------  --------
SMITH     800          0         0
ALLEN       0       1600         0
WARD        0       1250         0
JONES       0          0      2975
MARTIN      0       1250         0
BLAKE       0          0      2850
CLARK       0          0      2450
  1. 使用 UNION ALL 和 CASE 语句

另一种实现行列转换的方法是使用 UNION ALL 和 CASE 语句。以下是一个示例:

假设有一个订单表(ORDERS):

ORDER_ID  PRODUCT_NAME  ORDER_DATE  ORDER_QUANTITY
--------  -----------  ----------  --------------
1         Product A    2020-01-01            100
2         Product B    2020-01-01            200
3         Product A    2020-01-02            150
4         Product B    2020-01-02            250

现在想要将该表中的 PRODUCT_NAME 作为列,ORDER_QUANTITY 作为值进行转换,可以使用以下 SQL 语句:

SELECT
  ORDER_DATE,
  SUM(CASE WHEN PRODUCT_NAME = 'Product A' THEN ORDER_QUANTITY ELSE 0 END) AS "Product A",
  SUM(CASE WHEN PRODUCT_NAME = 'Product B' THEN ORDER_QUANTITY ELSE 0 END) AS "Product B"
FROM ORDERS
GROUP BY ORDER_DATE;

执行该语句后,可以得到以下结果:

ORDER_DATE  Product A  Product B
----------  --------  --------
2020-01-01       100       200
2020-01-02       150       250

以上就是两种 Oracle 中实现行列转换的方法

oracle 行转列

原文地址: https://www.cveoy.top/t/topic/fzgj 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录