2014-12-18 8 views
0

Я не могу найти пример такого типа стержня, если это возможно.MS Sql Server Разверните два столбца

+---------+---------+ 
| column1 | column2 | 
+---------+---------+ 
|  10 | A  | 
|  20 | B  | 
|  30 | C  | 
+---------+---------+ 

Я хотел бы мой запрос, чтобы вернуть

+----+----+----+ 
| A | B | C | 
+----+----+----+ 
| 10 | 20 | 30 | 
+----+----+----+ 

Я хотел бы сделать это, не создавая представление или динамическую таблицу.

Я пробовал опцию pivot, но у меня возникла проблема с пониманием того, как использовать динамические значения из запроса. Мой запрос:

Select column1, column3 + '_' + column4 as column2 
from table1 

Теперь я хочу использовать значения столбца2 как имена столбцов со связанными значениями столбца1.

ответ

1

Вы можете использовать функцию PIVOT:

select A, B, C 
from yourtable 
pivot 
(
    max(column1) -- column values 
    for column2 in (A, B, C) -- new column names 
) p; 

Если у вас есть динамические столбцы, то вам придется использовать динамический SQL и реализовать его внутри хранимой процедуры. Код будет похож на:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

-- create the list of columns for the pivot 
select @cols = STUFF((SELECT ',' + QUOTENAME(column2) 
        from 
        (
         select column3 + '_' + column4 as column2 
         from table1 
        ) d 
        group by column2 
        order by column2 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT ' + @cols + ' 
      from 
      (
       Select column1, column3 + ''_'' + column4 as column2 
       from table1 
      ) x 
      pivot 
      (
       max(column1) 
       for column2 in (' + @cols + ') 
      ) p ' 

exec sp_executesql @query; 
+0

@ user1088014 Если у вас есть динамические значения, вам нужно будет использовать динамический sql. Планируете ли вы использовать представление для этой или хранимой процедуры? Вы не сможете использовать динамический sql в представлении. – Taryn

+0

Я тоже не планировал использовать. У меня нет ключей к базе данных, поэтому я пытаюсь работать только с sql. Поэтому, я думаю, я слышал, что вы говорите, что это невозможно сделать с помощью сводного запроса. Данные - экзамен, а разные экзамены имеют разное количество разделов. Разделы - это столбец2. – dutchlab

+0

@ user1088014 Да, это можно сделать, я обновил свой ответ, чтобы включить версию, как это сделать динамически. – Taryn

0
select case when column2 = 'A' then column1 end as A, 
     case when column2 = 'B' then column1 end as B, 
     case when column2 = 'C' then column1 end as C 
from your_table 
Смежные вопросы