SQL 查询和优化(七)

行转列
常用方法有CASE WHEN THEN 和 PIVOT函数两种方法

查询需要,对emp表按job分组汇总,每个部门显示为一列

SELECT job AS 工作,
        SUM (CASE deptno WHEN '10' THEN sal END) AS 部门10工资
        SUM (CASE deptno WHEN '20' THEN sal END) AS 部门20工资
        SUM (CASE deptno WHEN '30' THEN sal END) AS 部门30工资
        SUM (sal) AS 总工资
    FROM emp
    GROUP BY job
    ORDER BY 1;

这里写图片描述

PIVOT方法相对简单,语法如下
SELECT ....  
FROM <table-expr>  
   PIVOT  
     (  
      aggregate-function(<column>)  
      FOR <pivot-column> IN (<value1>, <value2>,..., <valuen>)  
        ) AS <alias>  
WHERE .....  
实例
SELECT * 
    FROM (SELECT job,deptno,sal FROM emp)
    POVIT ( SUM(sal) AS s
        FOR deptno 
        IN(10 AS d10,20,30 AS d30)
    )
ORDER BY 1;

这里写图片描述

如果还要增加提成的返回,用PIVOT则只需要增加一个设定
SELECT * 
    FROM (SELECT job,deptno,sal,comm FROM emp)
    POVIT ( SUM(sal) AS s,SUM(comm) AS c
        FOR deptno 
        IN(10 AS d10,20,30 AS d30)
    )
ORDER BY 1;
而CASE WHEN THEN则要增加三个语句
SELECT job AS 工作,
        SUM (CASE deptno WHEN '10' THEN sal END) AS 部门10工资
        SUM (CASE deptno WHEN '20' THEN sal END) AS 部门20工资
        SUM (CASE deptno WHEN '30' THEN sal END) AS 部门30工资
        SUM (CASE deptno WHEN '10' THEN comm END) AS 部门10提成
        SUM (CASE deptno WHEN '20' THEN comm END) AS 部门20提成
        SUM (CASE deptno WHEN '30' THEN comm END) AS 部门30提成
    FROM emp
    GROUP BY job
    ORDER BY 1;

选自《Oracle 查询优化改写技巧与案例》 有教无类 落落 著

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值