SQL Server-将行转换为列

3

我已经搜寻了许多关于这个问题的答案,如果已经有人回答过了,请见谅!

我在SQL 2005中查询得到了以下结果:

ID

1234

1235

1236

1267

1278

What I want is

column1|column2|column3|column4|column5
---------------------------------------
1234   |1235   |1236   |1267   |1278

我不太理解枢轴运算符,但这似乎会涉及到它。目前我可以处理只有5行的情况,但是最好能够动态调整,即可以扩展到x行。
编辑: 我最终想要的是将每个结果列的值分配给变量,例如:
DECLARE @id1 int, @id2 int, @id3 int, @id4 int, @id5 int

SELECT @id1 = column1, @id2 = column2, @id3 = column3, @id4 = column4, 
@id5 = column5 FROM [transposed_table]

1
可能重复:https://dev59.com/gVrUa4cB1Zd3GeqPghhY - Madhan Kumar
可能是在SQL中转置列和行的简单方法?的重复问题。 - tom redfern
3个回答

5
您的查询中还需要为每个ID添加一个值字段以进行聚合。然后您可以像这样操作:
select [1234], [1235]
from
(
    -- replace code below with your query, e.g. select id, value from table
    select
    id = 1234,
    value = 1
    union
    select
    id = 1235,
    value = 2
) a
pivot
(
  avg(value) for id in ([1234], [1235])
) as pvt

2

1
如果您有一个分组的扁平数据结构,想要进行分组转置,例如:
GRP  | ID
---------------
1    | 1234
1    | 1235
1    | 1236
1    | 1267
1    | 1278
2    | 1234
2    | 1235
2    | 1267
2    | 1289

你希望它的分组转置看起来像这样:

GRP | Column 1 | Column 2 | Column 3 | Column 4 | Column 5
-------------------------------------------------------------
1   | 1234     | 1235     | 1236     | 1267     | 1278
2   | 1234     | 1235     | NULL     | 1267     | NULL

您可以使用类似此查询的方法来完成:

SELECT
    Column1.ID As column1,
    Column2.ID AS column2,
    Column3.ID AS column3,
    Column4.ID AS column4,
    Column5.ID AS column5
FROM
    (SELECT GRP, ID FROM FlatTable WHERE ID = 1234) AS Column1
LEFT OUTER JOIN
    (SELECT GRP, ID FROM FlatTable WHERE ID = 1235) AS Column2
ON Column1.GRP = Column2.GRP
LEFT OUTER JOIN
    (SELECT GRP, ID FROM FlatTable WHERE ID = 1236) AS Column3
ON Column1.GRP = Column3.GRP
LEFT OUTER JOIN
    (SELECT GRP, ID FROM FlatTable WHERE ID = 1267) AS Column4
ON Column1.GRP = Column4.GRP
LEFT OUTER JOIN
    (SELECT GRP, ID FROM FlatTable WHERE ID = 1278) AS Column5
ON Column1.GRP = Column5.GRP

(1)这假设您事先知道需要哪些列 - 请注意,我在此示例中有意省略了ID = 1289

(2)这基本上使用一堆左外连接一次附加1列,从而创建转置。左外连接(而不是内部连接)允许某些列为空,如果它们没有来自平面表的相应值,则不会影响任何后续列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接