ORACLE-行转列
行转列的两种方法(多行转多列)
参考链接:
http://www.2cto.com/database/201501/367164.html
http://www.oracle-developer.net/display.php?id=506
示例一:
测试数据源
第一步:建表
CREATE TABLE DEMO_PIVOT(ID NUMBER, NAME VARCHAR(20), NUMS1 NUMBER, NUMS2 NUMBER, NUMS3 NUMBER, NUMS4 NUMBER, SEASON VARCHAR2(20));
第二步:造数据
INSERT INTO DEMO_PIVOT VALUES (1, '苹果', 1000, 1500, 1800, 5000, '第一季'); INSERT INTO DEMO_PIVOT VALUES (2, '苹果', 2000, 1800, 3000, 1000, '第二季'); INSERT INTO DEMO_PIVOT VALUES (3, '葡萄', 4000, 2000, 3000, 3500, '第一季'); INSERT INTO DEMO_PIVOT VALUES (4, '葡萄', 3500, 3000, 2800, 4500, '第二季'); INSERT INTO DEMO_PIVOT VALUES (5, '橘子', 5000, 3000, 4000, 4500, '第一季'); INSERT INTO DEMO_PIVOT VALUES (6, '橘子', 3000, 5000, 1000, 6000, '第二季'); INSERT INTO DEMO_PIVOT VALUES (7, '芒果', 4200, 4000, 3200, 5400, '第一季'); INSERT INTO DEMO_PIVOT VALUES (8, '芒果', 5500, 5000, 2000, 8000, '第二季'); COMMIT;
查询水果每季度销量
方法一:使用PIVOT()函数,实现行转列 ORACLE11.0以上才支持该函数
WITH PIVOT_DATA AS (SELECT NAME, SEASON, NUMS1 + NUMS2 + NUMS3 + NUMS4 ZONG FROM DEMO_PIVOT) SELECT * FROM PIVOT_DATA PIVOT (SUM(ZONG) FOR SEASON IN('第一季' 第一季, '第二季' 第二季)) ORDER BY NAME;
方法二
SELECT T.NAME, SUM(CASE WHEN T.SEASON = '第一季' THEN T.TOTAL END) 第一季, SUM(CASE WHEN T.SEASON = '第二季' THEN T.TOTAL END) 第二季 FROM (SELECT NAME, SEASON, NUMS1 + NUMS2 + NUMS3 + NUMS4 TOTAL FROM DEMO_PIVOT) T GROUP BY T.NAME ORDER BY T.NAME;
示例二:查询不同工作及不同部门的薪水总和
--这种方式并不能满足要求 SELECT JOB, DEPTNO, SUM(SAL) AS SUM_SAL FROM EMP GROUP BY JOB, DEPTNO ORDER BY JOB, DEPTNO;
方式一:使用PIVOT()函数,实现行转列 ORACLE11.0以上才支持该函数
WITH PIVOT_DATA AS (SELECT DEPTNO, JOB, SAL FROM EMP) SELECT * FROM PIVOT_DATA PIVOT (SUM(SAL) FOR DEPTNO IN(10, 20, 30));
方式二
SELECT * FROM (SELECT DEPTNO, JOB, SAL FROM EMP) PIVOT(SUM(SAL) FOR DEPTNO IN(10, 20, 30));
注意:示例二主要展示的是方式一和方式二的不同
多行转单列
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/6929522.html