Sql Server 经典:行列转换与透视(Pivot方法)

时间:2024-01-30 12:55:21

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

效果如下:

 

 

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