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

效果如下:

 

 

這個是透視,逆透視--未完待續…………


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM