您可以使用 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
如果要使用 PIVOT 函数,则可以 UNPIVOTgross_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)
请参阅演示。这会将当前数据转换为结果:
| 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 |