2016-01-22 113 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