2012-05-22 7 views
2

Я искал высоко и низко для ответа на это, поэтому извиняюсь, если об этом уже ответили! У меня есть следующий результат запроса в SQL 2005:SQL Server - Транспонирование строк в столбцы

ID 

1234 

1235 

1236 

1267 

1278 

То, что я хочу, это

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

Я совсем не могу получить мою голову вокруг оператора поворота, но это выглядит, как это будет быть вовлечены. Я могу работать с тем, что на данный момент существует всего 5 строк, но бонус должен быть динамическим, т. Е. Масштабироваться до x строк.

EDIT: То, что я в конечном счете после этого, присваивает значения каждого результирующего столбца переменным, например.

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

Возможное повторение: [http://stackoverflow.com/questions/7002069/how-to-transpose-a-resultset-from-sql][1] [1]: HTTP: // stackoverflow.com/questions/7002069/how-to-transpose-a-resultset-from-sql –

+0

Возможный дубликат [Простой способ транспонирования столбцов и строк в Sql?] (http://stackoverflow.com/questions/13372276/ простой-to-transpose-columns-and-rows-in-sql) –

ответ

4

Вам также нужно поле значения в вашем запросе для включения каждого идентификатора. Затем вы можете сделать что-то вроде этого

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 
+0

Это сработало для меня, спасибо. – nonpoliticaltag

0

В случае, если вы имеете сгруппированный плоскую структуру данных, которую вы хотите группы транспонирование, как например:

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 столбцом за раз, создавая таким образом транспозицию. Левые внешние соединения (а не внутренние соединения) позволяют некоторым столбцам быть нулевыми, если они не имеют соответствующих значений из плоской таблицы, без влияния на последующие столбцы.

Смежные вопросы