2016-01-22 125 views
3

有無這樣的查詢:此查詢的如何通過行名選擇數據

declare @tbl TABLE(name varchar(50), [par] varchar(50)) 

insert into @tbl(name,par) 
values('a1','test1'),('a2','test2'),('a3','test3'),('a1','test11'),('a2','test22'),('a3','test33'),('a1','test111'),('a2','test222'),('a3','test333') 

結果是:

SELECT * FROM @tbl 

name par 
a1 test1 
a2 test2 
a3 test3 
a1 test11 
a2 test22 
a3 test33 
a1 test111 
a2 test222 
a3 test333 

如何編寫查詢選擇這樣嗎?

a1   a2   a3 
test1  test2  test3 
test11  test22 test33 
test111  test222 test333 

回答

5

你可以使用窗口功能,有條件的聚集結合:

;WITH cte AS 
(
    SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY name ORDER BY par) 
    FROM @tbl 
) 
SELECT 
    [a1] = MAX(CASE WHEN name = 'a1' THEN par END) 
,[a2] = MAX(CASE WHEN name = 'a2' THEN par END) 
,[a3] = MAX(CASE WHEN name = 'a3' THEN par END) 
FROM cte 
GROUP BY rn; 

LiveDemo

輸出:

╔═════════╦═════════╦═════════╗ 
║ a1 ║ a2 ║ a3 ║ 
╠═════════╬═════════╬═════════╣ 
║ test1 ║ test2 ║ test3 ║ 
║ test11 ║ test22 ║ test33 ║ 
║ test111 ║ test222 ║ test333 ║ 
╚═════════╩═════════╩═════════╝ 

或者使用PIVOT

;WITH cte AS 
(
    SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY name ORDER BY par) 
    FROM @tbl 
) 
SELECT [a1], [a2],[a3] 
FROM cte 
PIVOT (MAX(par) FOR name IN ([a1],[a2],[a3])) pvt; 

LiveDemo2

注:

如果你不事先知道列名,你可以使用動態支點。

+1

謝謝你,你救我的時間 – GeoVIP