2010-11-24 14 views
2

に行を変換します。私は(上位3日付とそれらに対応するヴァルスEMP 1を選択した場合は、次のような結果を取得する必要があります私はfollwoing構造持つ列

Emp PayDate  Amount  
1 11/23/2010 500  
1 11/25/2010 -900  
1 11/28/2010 1000  
1 11/29/2010 2000  
2 11/25/2010 2000  
3 11/28/2010 -3000  
2 11/28/2010 4000  
3 11/29/2010 -5000 

を - 彼らが存在する場合 - 第四行は常に無視されますEMP 2が選択されている場合)

PayDate1  Amount1 Paydate2  Amount2 Paydate3 Amount3 
11/23/2010 500  11/25/2010 -900  11/28/2010 1000 

私は、次のような結果を取得する必要があります

私が取得する必要があり
Paydate1 Amount1 Paydate2  Amount2 Paydate3 Amount3 
11/25/2010 2000  11/28/2010 4000  NULL  NULL 

EMP 3行のそれぞれのデータを取得するには

Paydate1  Amount1 Paydate2  Amount2 Paydate3 Amount3 
11/28/2010 -3000  11/29/2010 -5000 

を選択した場合、次の結果が、私は次のクエリを実行することができます

select top 3 Paydate, Amount from Table where Emp = @Emp 

をしかし、どのように、私はピボットファッションになり得るのですか?

答えて

0
CREATE TABLE dbo.Table1 
(
    Emp  int, 
    PayDate datetime, 
    Amount  int 
) 
GO 

INSERT INTO dbo.Table1 VALUES (1, '11/23/2010',500) 
INSERT INTO dbo.Table1 VALUES (1, '11/25/2010',-900) 
INSERT INTO dbo.Table1 VALUES (1, '11/28/2010',1000) 
INSERT INTO dbo.Table1 VALUES (1, '11/29/2010',2000) 
INSERT INTO dbo.Table1 VALUES (2, '11/25/2010',2000) 
INSERT INTO dbo.Table1 VALUES (3, '11/28/2010',-3000) 
INSERT INTO dbo.Table1 VALUES (2, '11/28/2010',4000) 
INSERT INTO dbo.Table1 VALUES (3, '11/29/2010',-5000) 


;WITH cte AS 
(SELECT Emp, PayDate, Amount, PayDateRowNumber 
FROM 
(SELECT Emp, 
     PayDate, 
     Amount, 
     ROW_NUMBER() OVER (PARTITION BY Emp ORDER BY PayDate) AS PayDateRowNumber 
FROM Table1) AS RankedTable1 
WHERE PayDateRowNumber < 4) 
SELECT c1.Emp AS Emp, c1.PayDate AS PayDate1 
     ,c1.Amount AS Amount1, c2.PayDate AS PayDate2 
     ,c2.Amount AS Amount2, c3.PayDate AS PayDate3, c3.Amount AS Amount3 
FROM cte c1 
LEFT JOIN cte c2 ON c2.Emp = c1.Emp AND c2.PayDateRowNumber = 2 
LEFT JOIN cte c3 ON c3.Emp = c2.Emp AND c3.PayDateRowNumber = 3 
WHERE c1.PayDateRowNumber = 1 

出力は次のとおりです。

alt text

いくつかの注意点は、それが(簡単に変更することができますが)同じ雇用者/日付の集計額ではないということです。また、 "TOP 3"の定義に応じてROW_NUMBER()とDENSE_RANK()を比較してROW_NUMBER()の使用を確認するように変更したい場合があります

1

SQL Server 2005+ hereのピボットに関する優れた記事があります。

関連する問題