如何按行名选择数据

时间:2016-01-22 13:58:45

标签: sql-server tsql sql-server-2008-r2

像这样查询:

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

1 个答案:

答案 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

注意:

如果您事先不知道列名,则可以使用动态数据透视。