CreateTime--2017年6月1日16:17:56
Author:Marydon行转列的两种方法
参考链接:
示例一:
测试数据源
第一步:建表
CREATE TABLE DEMO_PIVOT(ID NUMBER, NAME VARCHAR(20), NUMS1 NUMBER, NUMS2 NUMBER, NUMS3 NUMBER, NUMS4 NUMBER, SEASON VARCHAR2(20));
第二步:造数据
INSERT INTO DEMO_PIVOTVALUES (1, '苹果', 1000, 1500, 1800, 5000, '第一季');INSERT INTO DEMO_PIVOTVALUES (2, '苹果', 2000, 1800, 3000, 1000, '第二季');INSERT INTO DEMO_PIVOTVALUES (3, '葡萄', 4000, 2000, 3000, 3500, '第一季');INSERT INTO DEMO_PIVOTVALUES (4, '葡萄', 3500, 3000, 2800, 4500, '第二季');INSERT INTO DEMO_PIVOTVALUES (5, '橘子', 5000, 3000, 4000, 4500, '第一季');INSERT INTO DEMO_PIVOTVALUES (6, '橘子', 3000, 5000, 1000, 6000, '第二季');INSERT INTO DEMO_PIVOTVALUES (7, '芒果', 4200, 4000, 3200, 5400, '第一季');INSERT INTO DEMO_PIVOTVALUES (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_DATAPIVOT (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));
注意:示例二主要展示的是方式一和方式二的不同