1

我在Table1这里展示了一个:

;WITH Table1 AS (
SELECT *
FROM (VALUES 
(164021, 'Balajee', 100, 100, 'YTD'),
(164021, 'Balajee', 200, 100, 'YTD'),
(164021, 'Balajee', 400, 300, 'MTD'),
(164021, 'Balajee', 200, 100, 'MTD')
) as t (EmpID, [Emp Name], GROSS_PAY, NET_PAY, DUR_TYPE)
)

此表具有称为持续时间类型的列,其值可以为YTDMTD。现在我希望我的表在使用 Pivot 进行选择后看起来如下表所示。有人可以帮我做到这一点吗?我对这个 Pivot 很陌生,需要一些帮助。

EmpID   Empname Grosspay_ytd    net_pay_ytd Grosspay_mtd    netpay_mtd
------- ------- --------------- ----------- --------------- -----------
164021  Balajee 300             200         600             400
4

2 回答 2

2

您可以使用 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_paynet_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 |
于 2013-06-03T10:33:29.553 回答
1

试试这个 sql。

select empid,empname,sum(case dur_type when dur_type='YTD' then gross_pay else 0 END)as grosspay_ytd,
sum(case when dur_type='MTD' then gross_pay else 0 END) as grosspay_mtd  ,
sum(case when dur_type='YTD' then net_pay else 0 END) as netpay_ytd,
sum(case when dur_type='MTD' then net_pay else 0 END) as netpay_mtd
from employee
group by empid,empname,dur_type
于 2013-06-03T09:09:56.590 回答