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

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

 

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值