2011-11-23 56 views
0

我想這個表格轉換在SQL Server中的另一列

ID TestID Elapsed ActionID 
=================================== 
1 1   16 a1 
2 1   17 a2 
3 1   13 a3 
4 1   14 a4 
5 2   19 a1 
6 2   21 a2 
7 2   11 a3 
8 2   22 a4 

對此

TestID a1 a2 a3 a4 
====================================== 
1  16 17 13 14 
2  19 21 11 22 

這是可能轉化行列順序?

回答

1

是的,如果只有一個爲每個活動ID testid

有樞軸操作員Ajoe提到,但我認爲傳統的 語法更容易理解(如果不立即明顯)。

您可以通過testid對行進行分組,因此您將獲得每行testid一行結果 。你選擇的是每個組中的「最大」,其中acitionid是特定的。或者最小值,平均值或總和 - 這是 ,因爲每個組中只有一個項目。

SELECT testid, 
    MAX(CASE WHEN actionid = 'a1' THEN elapsed ELSE null END) AS a1, 
    MAX(CASE WHEN actionid = 'a2' THEN elapsed ELSE null END) AS a2, 
    MAX(CASE WHEN actionid = 'a3' THEN elapsed ELSE null END) AS a3, 
    MAX(CASE WHEN actionid = 'a4' THEN elapsed ELSE null END) AS a4 
FROM results 
GROUP BY testid 
0

如果您使用的是SQL Server 2005(或更高版本),則下面是查詢,並附有概念驗證。享受:

--Proof of concept structure and data creation 
create table #t (ID int, TestID int, Elapsed int, ActionID varchar(10)) 

insert into #t (ID, TestID, Elapsed, ActionID) values 
(1, 1,   16, 'a1'), 
(2, 1,   17, 'a2'), 
(3, 1,   13, 'a3'), 
(4, 1,   14, 'a4'), 
(5, 2,   19, 'a1'), 
(6, 2,   21, 'a2'), 
(7, 2,   11, 'a3'), 
(8, 2,   22, 'a4'); 
--end of structure and data creating 

--actual query starts here 
DECLARE @cols VARCHAR(1000) 
DECLARE @sqlquery VARCHAR(2000) 

SELECT @cols = STUFF((SELECT distinct ',' + QuoteName([ActionID]) 
         FROM #t FOR XML PATH('')), 1, 1, '') 

SET @sqlquery = 'SELECT * FROM 
     (SELECT TestID, Elapsed, ActionID 
     FROM #t ) base 
     PIVOT (SUM(Elapsed) FOR [ActionID] 
     IN (' + @cols + ')) AS finalpivot' 

--Depending on your approach, you might want to use MAX instead of SUM. 
--That will depend on your business rules 

EXECUTE (@sqlquery) 
--query ends here 


--proof of concept cleanup 
drop table #t; 

無論你在ActionID有多少不同的值,這將工作。它用PIVOT動態地組裝一個查詢。您可以通過動態列來執行PIVOT的唯一方法是動態組裝查詢,這可以在SQL Server中完成。

其他例子:

相關問題