zoukankan      html  css  js  c++  java
  • Sql Server 经典:行列转换与透视(Pivot方法)

    Sql server常用的分组聚合应用很广泛,但有时在展示时我们需要用到类似excel透视的效果;

    那么如何达到这种透视效果呢?

    如下例:

    以Oracle经典库scott为例:

      我们要求展现每个部门下(deptno)、各职(job)的所有综合工资是多少,正常情况下我们会使用如下查询

    1 select deptno,job,SUM(sal) as sum_sal
    2     from emp
    3     group by deptno,job

    效果如下:

    但是如果我们要求deptno纵向排列,Job横向排列应该如何呢?

    常规的写法如下:

    1 --常规透视
    2 select deptno,
    3     sum(case  when job='ANALYST' then sal else 0 end) as ANALYST,
    4     sum(case  when job='CLERK' then sal else 0 end) as CLERK,
    5     sum(case  when job='MANAGER' then sal else 0  end) as MANAGER,
    6     sum(case  when job='PRESIDENT' then sal  else 0 end) as PRESIDENT,
    7     sum(case  when job='SALESMAN' then sal else 0  end) as SALESMAN
    8     from emp 
    9     group by deptno

    得到的结果如下:

    习惯表格操作的或许会感觉这样排列更加直观一点;

    当然这是常规的写法,Sql Server 自带的Pivot方法也可以实现:不过对版本的要求至少是2008

    如下:

    1 --pivot透视    
    2     select deptno,ANALYST,CLERK,MANAGER,PRESIDENT,SALESMAN
    3         from
    4             (select deptno,job,sal from emp)as a
    5         pivot (sum(sal) 
    6             for job 
    7                 in (ANALYST,CLERK,MANAGER,PRESIDENT,SALESMAN)) as b

    效果同上

    但是需要注意一点,如果这个查询的行和列相反(即:deptno横向,job纵向),

    因为deptno值全是数值,那么在书写的时候要注意一下,加上"[]",

    如下

    1 select job,[10],[20],[30]
    2     from 
    3         (select job,deptno,sal from emp) a
    4     pivot (sum(sal) 
    5         for deptno 
    6             in ([10],[20],[30]) )b

    效果如下:

    这个是透视,逆透视--未完待续…………

    --Ocarina我是一只可爱的小尾巴
  • 相关阅读:
    第一节 2字符串 简单
    第一节 1C#基础 简单
    终于找到wamp修改密码方式了!
    js通过class name获得元素
    JavaScript中arguments
    对技术的态度
    C++的坑真的多吗?
    js 常用正则
    js利用Array.splice实现Array的insert/remove
    c# asp.net webform web页面打印,可以控制需要打印和不需要打印的位置
  • 原文地址:https://www.cnblogs.com/azrealer/p/12092963.html
Copyright © 2011-2022 走看看