sql-server - 如何按行名选择数据

标签 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

最佳答案

您可以将窗口函数与条件聚合结合使用:

;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

注意:

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

关于sql-server - 如何按行名选择数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34948461/

相关文章:

asp.net - 开发和测试环境最佳实践?

sql-server - 带有间隙的 Azure 数据工厂复制标识列

sql - 使用 T-SQL 根据年月日创建日期

mysql - select和where子句中没有主键时的数据获取时间?

triggers - 如何在 SQL Server 2008 R2 表中添加 "last updated"列?

SQL CASE LIKE 具有多种选择

sql - OPENROWSET - 如何以文本形式阅读所有内容?

用于生成字母数字字符串中的下一个序列的 SQL 代码

sql - 获取 SQL Server 跨数据库依赖关系

sql - 内部连接到 select 语句,其中内部 select 语句的 where 子句引用外部 select?