有这样的查询:
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
最佳答案
您可以将窗口函数与条件聚合结合使用:
;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;
输出:
╔═════════╦═════════╦═════════╗
║ 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;
注意:
如果您事先不知道列名,则可以使用动态数据透视表。
关于sql-server - 如何按行名选择数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34948461/