Преобразование столбцов таблицы в строки - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть таблица SQL Server, в которую я хотел бы преобразовать столбцы в строки (от широких до высоких).

Текущий формат таблицы:

enter image description here

Желаемый формат таблицы:

enter image description here

Я посмотрел на вызов метода pivoting / unpivoting, но я не могу получить форматирование так, как мне нужно. Спасибо за любую помощь!

1 Ответ

0 голосов
/ 27 апреля 2018

UnPivot, безусловно, более производительный, но вот один из подходов, который будет динамически отключать практически любую таблицу, запрос или запись БЕЗ , фактически использующих динамический SQL

Пример

Declare @YourTable Table (Date date,cost1 int,cost2 int,cost3 int)
Insert Into @YourTable Values 
 ('6/30/2017',3,4,5),
 ('6/24/2017',3,4,5),
 ('6/22/2017',3,4,5)

Select C.*
 From @YourTable A
 Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
 Cross Apply (
                Select Item  = a.value('local-name(.)','varchar(100)')
                      ,Value = a.value('.','varchar(max)') 
                 From  B.XMLData.nodes('/row')  as C1(n)
                 Cross Apply C1.n.nodes('./@*') as C2(a)
                 Where a.value('local-name(.)','varchar(100)') not in ('Column1','Column2')
             ) C

Возвращает

Item    Value
Date    2017-06-30
cost1   3
cost2   4
cost3   5
Date    2017-06-24
cost1   3
cost2   4
cost3   5
Date    2017-06-22
cost1   3
cost2   4
cost3   5

Теперь, с небольшим поворотом

Select A.Date
      ,C.*
 From @YourTable A
 Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
 Cross Apply (
                Select Item  = a.value('local-name(.)','varchar(100)')
                      ,Value = a.value('.','varchar(max)') 
                 From  B.XMLData.nodes('/row')  as C1(n)
                 Cross Apply C1.n.nodes('./@*') as C2(a)
                 Where a.value('local-name(.)','varchar(100)') not in ('Date','Column2')
             ) C

Returns

Date        Item    Value
2017-06-30  cost1   3
2017-06-30  cost2   4
2017-06-30  cost3   5
2017-06-24  cost1   3
2017-06-24  cost2   4
2017-06-24  cost3   5
2017-06-22  cost1   3
2017-06-22  cost2   4
2017-06-22  cost3   5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...