2

我已经在高处和低处搜索了这个问题的答案,如果已经回答了,我深表歉意!我从 SQL 2005 中的查询得到以下结果:

ID

1234

1235

1236

1267

1278

我想要的是

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]
4

3 回答 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
于 2012-05-22T10:23:24.400 回答
2

我想你会在这个答案中找到一个稍微不同的问题的答案:Generate "scatter plot" result of members against sets from SQL query

答案使用动态 SQL。查看 mellamokb 答案中的最后一个链接:http ://www.sqlfiddle.com/#!3/c136d/14 ,他在其中从行数据创建列名。

于 2012-05-22T10:20:14.920 回答
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) 这基本上是使用一堆左外连接来一次附加一列,从而创建转置。如果某些列没有来自平面表的对应值,则左外连接(而不是内连接)允许它们为空,而不会影响任何后续列。

于 2017-02-02T03:48:25.403 回答