2014-10-18 3 views
0

Существует таблица, которая, к сожалению, выдержан в следующем формате (собирается до 39 вместо 3):Преобразование Некоторые столбцы в строки данных

ТАБЛИЦА: Joined_Table

Key  Nm_1 Nm_2  Nm_3 Age1 Age2 Age3 State1 State2 State3 
1   Bob  Sally John 12 13 14 Fl.  AL.  NY. 
2   Jack Billy Jean 15 15 83 AL.  TX.  WA. 

Перед началом миграции SharePoint , Мне нужно выделить эти строки элементов в отдельных элементах. Мне нужно скопировать данные в другой таблице в подобном этому формату:

ТАБЛИЦА: dbo.Line_Items

K FK Name_T Age_T State_T 
1 1 Bob  12  Fl. 
2 1 Sally 13  AL 
3 1 John 14  NY 
4 2 Jack 15  AL 
5 2 Billy 15  TX 
6 2 Jean 83  WA 

Is сказали, рассмотреть вопрос об использовании «Cross Применить», и я планирую делать это, но мне интересно, есть ли у кого-нибудь еще опыт или предложение на чистый способ сделать это (помните, что это доходит до 39). Мне не нужно что-то чрезвычайно динамичное, так как я бы не прочь напечатать каждый тип столбца 39 раз. Например, я рассматривал возможность создания таблицы, а затем вставки строки в Nm_1, Age1, State1 для каждой строки, а затем замены 1 на 2 и т. Д. Но даже с помощью этого метода я не уверен, как создать новую строку на Nm_1, Age1 и State1 для всех экземпляров строк в исходной таблице.

+0

вы можете нужно сделать сочетание UNPIVOT и PIVOT – Ram

ответ

0

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

DECLARE @MyQuery nvarchar(MAX) 
DECLARE @MyInt int 

SET @MyInt = 1 

WHILE @MyInt <= 39 

BEGIN 

SET @MyQuery = 'INSERT INTO dbo.[Line_Items] 

(FK, Name_T, Age_T, State_T) 

SELECT [Key], [Nm_1], [Age1], [State1] 

FROM dbo.Joined_Table 

WHERE LTRIM(RTRIM(Nm_1)) NOT LIKE '''' 

ORDER BY ID 
' 

SET @MyQuery = REPLACE(@MyQuery,1,@MyInt) 
SET @MyInt = @MyInt+1 

EXEC(@MyQuery) 

    END 

`

1

Крест применяется довольно чистый раствор

select 
    key = row_number() over(order by fk, k), 
    fk, 
    name_t, 
    age_t, 
    state_t 
from tbl 
cross apply (
    values 
     (1, key, nm_1, age1, state1), 
     (2, key, nm_2, age2, state2), 
     -- ... 
     (39, key, nm_39, age39, state39) 
) c (k, fk, name_t, age_t, state_t) 
+0

я попробовал это, но неоднократно получают «Неправильный синтаксис рядом с« c'' ». Tbl, в вашем примере, соответствует новой таблице? –

+0

В итоге я написал цикл while с регулярным INSERT. Я буду честен. Я очень горжусь тем, что решил это самостоятельно, поскольку я очень глуп, SQL, но мне бы это понравилось, если бы вы могли помочь мне разобраться в том, что мне не хватает. Я обновил свой вопрос с именами имен для таблиц, если это может помочь. –

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