• ORACLE-行转列


    CreateTime--2017年6月1日16:17:56
    Author:Marydon

    行转列的两种方法

    参考链接:

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

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

  • 相关阅读:
    BZOJ5321 JXOI2017加法(二分答案+贪心+堆+树状数组)
    BZOJ5089 最大连续子段和(分块)
    Codeforces 893F(主席树+dfs序)
    BZOJ5092 分割序列(贪心)
    Codeforces Round #525 Div. 2 自闭记
    364. Nested List Weight Sum II
    362. Design Hit Counter
    369. Plus One Linked List
    370. Range Addition
    366. Find Leaves of Binary Tree
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/6929522.html
Copyright © 2020-2023  润新知