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));

    注意:示例二主要展示的是方式一和方式二的不同

多行转单列

Oracle WM_CONCAT()的替代方案

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

posted @ 2017-06-01 16:28  Marydon  阅读(675)  评论(0编辑  收藏  举报