以一张薪资表为例,表结构如下:
表结构中,每个员工id对应有多个薪资项目以及金额,需要查询时转向,将每个员工的薪资项目转为横向一行显示。
在直接查询(加入一些限制条件以缩小结果集),
1
SELECT
2 ssp_pay_empid,
3 ssp_pay_sdate,
4 ssp_pay_edate,
5 ssp_pay_type,
6 ssp_pay_amount,
7 ssp_pay_item
8 FROM ssp_pay
9 where ssp_pay_empid = 00000073 and ssp_pay_type = ' RT ' and ssp_pay_item
10 IN ( ' /101 ' , ' /103 ' , ' /401 ' , ' /402 ' ) and ssp_pay_sdate = ' 2007-08-01 '
2 ssp_pay_empid,
3 ssp_pay_sdate,
4 ssp_pay_edate,
5 ssp_pay_type,
6 ssp_pay_amount,
7 ssp_pay_item
8 FROM ssp_pay
9 where ssp_pay_empid = 00000073 and ssp_pay_type = ' RT ' and ssp_pay_item
10 IN ( ' /101 ' , ' /103 ' , ' /401 ' , ' /402 ' ) and ssp_pay_sdate = ' 2007-08-01 '
得到如下结果:
需要将上述查询结果显示为一行,则使用SQL Server 2005新增的PIVOT,通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。
执行如下SQL:
1
select
2 ssp_pay_empid,
3 ssp_pay_sdate,
4 ssp_pay_edate,
5 ssp_pay_type,
6 [ /101 ] ,
7 [ /103 ] ,
8 [ /401 ] ,
9 [ /402 ]
10 from (
11 SELECT
12 ssp_pay_empid,
13 ssp_pay_sdate,
14 ssp_pay_edate,
15 ssp_pay_type,
16 ssp_pay_amount,
17 ssp_pay_item
18 FROM ssp_pay
19 where ssp_pay_empid = 00000073 and ssp_pay_type = ' RT ' and ssp_pay_sdate = ' 2007-08-01 '
20 ) AS SourceTable
21 PIVOT ( SUM (ssp_pay_amount) FOR ssp_pay_item
22 IN ( [ /101 ] , [ /103 ] , [ /401 ] , [ /402 ] )) AS PivotTable
2 ssp_pay_empid,
3 ssp_pay_sdate,
4 ssp_pay_edate,
5 ssp_pay_type,
6 [ /101 ] ,
7 [ /103 ] ,
8 [ /401 ] ,
9 [ /402 ]
10 from (
11 SELECT
12 ssp_pay_empid,
13 ssp_pay_sdate,
14 ssp_pay_edate,
15 ssp_pay_type,
16 ssp_pay_amount,
17 ssp_pay_item
18 FROM ssp_pay
19 where ssp_pay_empid = 00000073 and ssp_pay_type = ' RT ' and ssp_pay_sdate = ' 2007-08-01 '
20 ) AS SourceTable
21 PIVOT ( SUM (ssp_pay_amount) FOR ssp_pay_item
22 IN ( [ /101 ] , [ /103 ] , [ /401 ] , [ /402 ] )) AS PivotTable
结果为:
以上为记录笔记,无他用。