像这样查询:
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
答案 0 :(得分: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
强>
注意:
如果您事先不知道列名,则可以使用动态数据透视。