您可以使用 PIVOT 函数来获取结果,但是问题的一部分是您有两列要在两列中旋转。
由于要透视的数据位于两列中,因此您可以通过多种方式获得结果。您可以将聚合函数与 CASE 表达式一起使用:
select empid, empname,
sum(case when dur_type='YTD' then gross_pay else 0 end) gross_pay_ytd,
sum(case when dur_type='YTD' then net_pay else 0 end) net_pay_ytd,
sum(case when dur_type='MTD' then gross_pay else 0 end) gross_pay_mtd,
sum(case when dur_type='MTD' then net_pay else 0 end) net_pay_mtd
from yt
group by empid, empname;
见SQL Fiddle with Demo
如果您想使用 PIVOT 函数,那么您可以 UNPIVOT gross_pay 和 net_pay 列中的数据,以便数据存在于一列中,然后应用 PIVOT 函数。由于您使用的是 SQL Server 2008,因此您可以使用带有 VALUES 子句的 CROSS APPLY 来反透视数据:
select empid, empname, col+'_'+dur_type as col, value
from yt
cross apply
(
values
('gross_pay', gross_pay), ('net_pay', net_pay)
) c (col, value)
见Demo。这会将当前数据转换为结果:
| EMPID | EMPNAME | COL | VALUE |
--------------------------------------------
| 164021 | Balajee | gross_pay_YTD | 100 |
| 164021 | Balajee | net_pay_YTD | 100 |
| 164021 | Balajee | gross_pay_YTD | 200 |
| 164021 | Balajee | net_pay_YTD | 100 |
如您所见,我们知道每个员工都有多行,其中一列包含
您想要在最终数据透视结果中的列的名称。当您应用 PIVOT 函数时,代码将是:
select empid, empname,
gross_pay_ytd, net_pay_ytd, gross_pay_mtd, net_pay_mtd
from
(
select empid, empname, col+'_'+dur_type as col, value
from yt
cross apply
(
values
('gross_pay', gross_pay), ('net_pay', net_pay)
) c (col, value)
) d
pivot
(
sum(value)
for col in (gross_pay_ytd, net_pay_ytd, gross_pay_mtd, net_pay_mtd)
) piv;
见SQL Fiddle with Demo。这个版本和CASE版本都会给出结果:
| EMPID | EMPNAME | GROSS_PAY_YTD | NET_PAY_YTD | GROSS_PAY_MTD | NET_PAY_MTD |
--------------------------------------------------------------------------------
| 164021 | Balajee | 300 | 200 | 600 | 400 |