2016-07-20 3 views
-1

У меня есть таблица таблицы, в которой есть несколько столбцов, и я хочу преобразовать значения столбцов в виде столбцов для другой таблицы.Преобразование строк в столбцы в новой таблице

Я прилагаю один снимок экрана из моего требования.

Верхний стол - это мой основной стол, скажем, таблица1, а нижняя - моя таблица. enter image description here Благодаря

+0

вы можете просто свернуть mysql raw в столбец, используя регистр case –

+0

@Jens - Извините, что был по ошибке я использую sql server 2012 –

+1

Возможный дубликат [Эффективно преобразовывать строки в столбцы в sql-сервере] (http: // stackoverflow. com/questions/15745042/efficiently-convert-rows-to-columns-in-sql-server) – Ash

ответ

0

Я думаю, поворотное будет достаточно:

SELECT * 
FROM (
    SELECT [Action], [Key], 'Old' + Old as [a], OldValue as [Value] 
    FROM Table1 
    UNION ALL 
    SELECT [Action], [Key], 'New' + New, NewValue 
    FROM Table1 
    ) as p 
PIVOT (
    MAX([Value]) FOR [a] IN ([OldCol1],[OldCol2],[OldCol3],[NewCol1],[NewCol2],[NewCol3],[NewCol45]) 
) as pvt 

Выход:

Action Key OldCol1 OldCol2 OldCol3 NewCol1 NewCol2 NewCol3 NewCol45 
I  123 NULL NULL NULL NULL NULL NULL Sun 
U  123 Dog  Cat  Honey Dog  Mouse Bee  NULL 

Если есть МНОГО Old и «значения new`, то вам нужен динамический SQL

+0

спасибо, что это работает, и теперь я знаю, где была моя ошибка. –

+0

Отлично, если мой ответ вам помог! :) – gofr1

1

Хотя предложенному дубликата получит Вас часть пути там, вы на самом деле нужно UNPIVOT затем стержень, как это.

(О, и пожалуйста, не размещайте изображения DDL ценится и сохраняет нам печатать и/или угадывание.).

CREATE TABLE #Test(Action char, [Key] INT, Old varchar(5), OldValue varchar(5), New varchar(5), NewValue varchar(5)); 

INSERT INTO #Test VALUES 
('U', 123, 'Col1','Dog','Col1','Dog'), 
('U', 123, 'Col2','Cat','Col2','Mouse'), 
('U', 123, 'Col3','Honey','Col3','Bee'), 
('I', 123, NULL,NULL,'Col45','Sun'); 


SELECT PVT.Action 
     ,PVT.[Key] 
     ,PVT.OldCol1 
     ,PVT.OldCol2 
     ,PVT.OldCol3 
     ,PVT.NewCol1 
     ,PVT.NewCol2 
     ,PVT.NewCol3 
     ,PVT.NewCol45 FROM (
SELECT [Action] 
     ,[Key] 
     ,Label 
     ,Value 
FROM #Test 
CROSS APPLY (VALUES ('Old'+Old, OldValue), ('New'+New, NewValue)) c(label, value) 
)src 
PIVOT 
(
MAX(VALUE) FOR Label IN (OldCol1, NewCol1, OldCol2, NewCol2, OldCol3, NewCol3, NewCol45) 
)PVT 
ORDER BY PVT.Action Desc 


Action Key   OldCol1 OldCol2 OldCol3 NewCol1 NewCol2 NewCol3 NewCol45 
------ ----------- ------- ------- ------- ------- ------- ------- -------- 
U  123   Dog  Cat  Honey Dog  Mouse Bee  NULL 
I  123   NULL NULL NULL NULL NULL NULL Sun 

(2 row(s) affected) 
+0

это тоже работает, но решения grof1 были рядом с тем, где я застрял. спасибо anyways –

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