2013-06-03 93 views
1

我這裏有一個Table1圖所示:SQL Server 2008 R2的透視問題

;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 
+0

您是否認爲有人出現在這裏問一個問題,在哪裏對他們不重要?假設你的問題應該作爲比其他任何人更高的優先級來處理,這是無禮的。 –

+0

感謝您的信息Damien非信徒 –

回答

2

可以使用旋轉功能得到結果但問題的一部分是,你必須要在兩列轉動的兩列。

由於要透視的數據分爲兩列,因此可以通過幾種方法獲得結果。您可以使用聚合函數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_paynet_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 | 
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 
+0

感謝您的回覆,我已經通過添加案例來完成此操作,但需要知道我們是否可以使用pivot來完成此操作? –

+0

像這樣嵌套聚集是不可能的。 – Taryn

+0

@bluefeet:我的錯。請參閱最新的答案。 – ankurtr