2016-12-08 9 views
1

У меня есть запрос, который динамически генерирует различное количество строк с различными значениями столбцов ID. Мне нужно, чтобы PIVOT это в столбчатый результат. Ниже приведены мои текущие данные.Пытается развернуть несколько столбцов в T-SQL

ID Caption FieldName  FieldType 
--- --------- ------------ ------------ 
10 Caption 1 Field Name 1 Field Type 1 
11 Caption 2 Field Name 2 Field Type 2 
12 Caption 3 Field Name 3 Field Type 3 
20 Caption 4 Field Name 4 Field Type 4 
30 Caption 5 Field Name 5 Field Type 5 

Мой желаемый результат

10   11   12   20   30 
--------  ---------- ---------  ---------  --------- 
Caption 1  Caption 2  Caption 3  Caption 4  Caption 5 
Field Name 1 Field Name 2 Field Name 3 Field Name 4 Field Name 5 
Field Type 1 Field Type 2 Field Type 3 Field Type 4 Field Type 5 

Пожалуйста, обратите внимание, что значения 10, 11, 12, 20 и 30 можно изменить, чтобы быть что-то еще, так что я понимаю, что мне нужно сделать некоторые динамические SQL , Я хочу, чтобы избежать использования КУРСОРОВ, если это возможно.

Любые предложения приветствуются. Пожалуйста, простите форматирование

+1

Если вы понимаете, что вам нужно сделать некоторые динамические SQL, почему вы не включать код, который вы уже пробовали в пост ? – dfundako

+0

Я только посмотрел на другое сообщение, чтобы понять, что мне нужно делать, но я не уверен, как вставить мой код здесь. @ Дает мне некоторую ошибку при попытке вставить код. – gsva

+0

Я даже не уверен, можно ли это назвать PIVOT. Похоже, вы пытаетесь перенести таблицу. – DVT

ответ

0

2005 Версия

Declare @SQL varchar(max) 
Select @SQL = stuff((Select Distinct ',' + QuoteName(ID)+'=max(case when Item='+cast(ID as varchar(25))+' then Value else null end)' From YourTable Order By 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [Seq],'[email protected] +' 
From (
     Select Item=A.ID,B.* 
     From YourTable A 
     Cross Apply ( 
         Select Seq=1,Value=cast(A.Caption as varchar(max)) Union All 
         Select Seq=2,Value=cast(A.FieldName as varchar(max)) Union All 
         Select Seq=3,Value=cast(A.FieldType as varchar(max)) 
        ) B 
     ) A 
Group By Seq 
Order By Seq 
' 
Exec(@SQL); 

Возвращает

enter image description here

0

Если вы не возражаете происходит динамическое

Я колеблющимся, чтобы удалить SEQ (первый столбец результатов). Вы можете удалить [SEQ], из окончательного запроса, но я не уверен, что он сохранит правильную последовательность в большем наборе данных.

Declare @SQL varchar(max) 
Select @SQL = Stuff((Select Distinct ',' + QuoteName(ID) From YourTable Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [Seq],' + @SQL + ' 
    From (
     Select Item=A.ID,B.* 
     From YourTable A 
     Cross Apply (
         Select Seq=1,Value=cast(A.Caption as varchar(max)) Union All 
         Select Seq=2,Value=cast(A.FieldName as varchar(max)) Union All 
         Select Seq=3,Value=cast(A.FieldType as varchar(max)) 
        ) B 
     ) A 
Pivot (max(value) For Item in (' + @SQL + ')) p' 
Exec(@SQL); 

Возвращает

enter image description here

EDIT - С SEQ удален из конечного Выберите

enter image description here

+0

Результаты - это то, что я хочу, но при использовании кода выше я получаю синтаксическую ошибку. Это дает мне синтаксическую ошибку new Values ​​ – gsva

+0

Это зависит. Я получаю список полей, отображаемых на странице. Я пытаюсь создать общий сценарий, чтобы он выводил их в формат, который можно экспортировать в excel. Затем этот лист excel может быть заполнен данными для автоматизации тестирования. Количество этих полей может варьироваться от 10-60 – gsva

+0

. До генерации вывода, указанного выше для поворота, я делаю много манипуляций путем добавления или удаления некоторых полей на основе определенных условий. Таким образом, столбец идентификатора может быть неустойчивым, поэтому одинаковые значения со страницы на страницу – gsva