oracle 行转列
Oracle 中实现行转列的方法有多种,以下介绍其中的两种方法:
- 使用 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
- 使用 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 中实现行列转换的方法
原文地址: https://www.cveoy.top/t/topic/fzgj 著作权归作者所有。请勿转载和采集!