2017-02-16 24 views
1

Мне нужно выводить данные в виде набора результатов из хранимой процедуры, где столбцы исходных данных представляются в виде строк на выходе. Я должен увидеть строку для каждого столбца моего вывода, которая находится в моих исходных данных, и я должен увидеть столбец в моем выводе для каждой строки в исходных данных. Я просто не понимаю, как я могу это сделать, используя Pivot или другие методы, на которые я смотрел.SQL-перемещение столбцов в строки

Как только у меня есть данные, ориентированные так, как мне это нравится, я полагаю, что я буду запрашивать sys.columns, чтобы вставлять имена столбцов исходных данных в качестве первого столбца моего вывода. Мне также, вероятно, придется заранее запросить значения исходных данных, которые будут использоваться в качестве имен столбцов вывода. Я представляю себе какой-то великолепный динамический SQL в моем будущем, но при необходимости я могу сортировать все это самостоятельно. В основном я интересуюсь тем, как преобразовывать столбцы в строки. См. Ниже:

SELECT 
    ID 
    ,XID 
    ,Amount 
FROM (
     SELECT 11 as ID, 301 as XID, 50001 as Amount UNION ALL 
     SELECT 12 as ID, 302 as XID, 50002 as Amount UNION ALL 
     SELECT 13 as ID, 303 as XID, 50003 as Amount UNION ALL 
     SELECT 14 as ID, 304 as XID, 50004 as Amount 
    ) T1 
/* 
The above query returns this: 

ID XID Amount 
---------------- 
11 301 50001 
12 302 50002 
13 303 50003 
14 304 50004 


Instead I would like to see this: 

Column 11  12  13  14 
----------------------------------- 
ID  11  12  13  14 
XID  301 302 303 304 
Amount 50001 50002 50003 50004 

*/ 
+3

Отъезда PIVOT: https://technet.microsoft.com/en- us/library/ms177410 (v = sql.105) .aspx – Leonidas199x

+0

Это нечто противоположное тому, что вы хотите, но это shou ld направьте вас в правильном направлении http://stackoverflow.com/questions/15931607/convert-rows-to-columns-using-pivot-in-sql-server –

+0

Используя PIVOT, вы можете вызвать исходное значение для столбца ID представляют столбец для каждого идентификатора на выходе, но вы не можете заставить остальные исходные столбцы быть представлены в виде строк. Я не вижу, как делать то, что я хочу, с PIVOT. – RedRocketFire

ответ

1

Предполагая, что вам нужен динамический.

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(ID) From Yourtable Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [Column],' + @SQL + ' 
From (
     Select B.* 
     From YourTable A 
     Cross Apply (
         Values (1,''ID'' ,ID,ID) 
          ,(2,''XID'' ,ID,XID) 
          ,(3,''Amount'',ID,Amount) 
        ) B ([Seq],[Column],[Item],[Value]) 
    ) A 
Pivot (sum(Value) For [Item] in (' + @SQL + ')) p 
Order By [Seq] 
' 
Exec(@SQL); 

Возвращает

enter image description here

Если вы не нужен Dynamic

Select [Column],[11],[12],[13],[14] 
From (
     Select B.* 
     From YourTable A 
     Cross Apply (
         Values (1,'ID' ,ID,ID) 
          ,(2,'XID' ,ID,XID) 
          ,(3,'Amount',ID,Amount) 
        ) B ([Seq],[Column],[Item],[Value]) 
    ) A 
Pivot (sum(Value) For [Item] in ([11],[12],[13],[14])) p 
Order By [Seq] 
+0

Это потрясающее решение. Благодаря!!! – RedRocketFire

+0

@RedRocketFire Счастлив, что это помогло. Больше транспонирования, чем пивота :) –