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我是一只可爱的小尾巴
  • 相关阅读:
    const char* && string && String^ 类型转换
    vs2010 vc++ 统一修改所有工程的目录配置
    OSG开发概览
    osg渲染数据高程文件
    postgis数据库文件shapefile导入 dbf file (.dbf) can not be opened.shapefile import failed.
    Point ZM 转换为Point 类型
    Extjs关于alert显示不出—异步问题
    js执行顺序<转>
    HTML中IFrame父窗口与子窗口相互操作
    SpringMVC学习系列(6) 之 数据验证
  • 原文地址:https://www.cnblogs.com/azrealer/p/12092963.html
Copyright © 2011-2022 走看看