可以使用旋轉功能得到結果但問題的一部分是,你必須要在兩列轉動的兩列。
由於要透視的數據分爲兩列,因此可以通過幾種方法獲得結果。您可以使用聚合函數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
如果你想使用旋轉功能,那麼你可以在gross_pay
和net_pay
列unpivot的數據,以便在一個存在數據列,然後應用PIVOT功能。由於使用的是SQL Server 2008中您可以使用CROSS APPLY與VALUES子句unpivot的數據:
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 |
您是否認爲有人出現在這裏問一個問題,在哪裏對他們不重要?假設你的問題應該作爲比其他任何人更高的優先級來處理,這是無禮的。 –
感謝您的信息Damien非信徒 –