将列记录作为列名称

时间:2017-11-13 23:24:02

标签: sql sql-server

我有一张桌子:

 A | B
---+---
 a | 1qw
 b | 2q
 c | 3s
 a | 4sd
 b | 5 
 c | 6

输出表:

 a | b | c 
---+---+---
1qw| 2q| 3s 
4sd| 5 | 6

如何在sql server中获取输出表。这是一个示例,第一列中可能有超过3个不同的记录。

我用过:

select a,b,c from 
(select A,B from TABLE) as P
Pivot (max(B) for A in (a,b,c)

这只给了我一行(甚至不正确)。

1 个答案:

答案 0 :(得分:0)

当您使用下面的DDL脚本提供完全有效的SQL代码示例(即使没有得到您想要的内容)时,对您来说最简单,也是最容易回答这些类型的问题:

CREATE TABLE #Data( ID INT IDENTITY, A1 CHAR( 1 ), B1 VARCHAR( 5 ))
INSERT INTO #Data
VALUES
( 'a', '1qw' ), ( 'b', '2q ' ), ( 'c', '3s ' ),
( 'a', '4sd' ), ( 'b', '5  ' ), ( 'c', '6  ' )

诀窍是有一个“组ID”列,用于标识a,b,c记录的组(“桶”):

SELECT *, ROW_NUMBER() OVER( PARTITION BY A1 ORDER BY ID ) AS GroupID
FROM #Data
ORDER BY GroupID

我假设您对ID列有“位置依赖”,并且您的组是从ID列的值派生的,即ID = 2的b记录与ID = 1的记录在同一组中。如果您的初始数据设置不同,那么您需要提出自己的如何分配“组ID”的逻辑。

最终的PIVOT查询:

SELECT *
FROM
( SELECT A1, B1, ROW_NUMBER() OVER( PARTITION BY A1 ORDER BY ID ) AS GroupID
FROM #Data ) AS data
PIVOT(
    MAX( B1 ) FOR A1 IN( [a], [b], [c] )
) AS P

输出:

GroupID              a     b     c
-------------------- ----- ----- -----
1                    1qw   2q    3s 
2                    4sd   5     6  

参考文献:https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot