2016-07-28 2 views
0

(СТАВКИ на SQL Server 2008)SSIS UNPIVOT включая имена столбцов

У меня есть плоский файл (труба-разделителями), который я успешно разобранного в следующем формате:

AccountID FreeText1 FreeText2 FreeText3 FreeText4 
1   Some text More text Other text Different Text 
2   Some text More text Other text Different Text 
3   Some text More text Other text Different Text 

Мне нужен конец результат будет выглядеть так:

AccountID Title  TheData 
1   FreeText1 Some text 
1   FreeText2 More text 
1   FreeText3 Other text 
1   FreeText4 Different Text 
2   FreeText1 Some text 
2   FreeText2 More text 
2   Freetext3 Other text 
2   FreeText4 Different Text 
3   FreeText1 Some text 
3   FreeText2 More text 
3   FreeText3 Other text 
3   FreeText4 Different Text 

Я до сих пор довольно новичок в SSIS, поэтому изучаю, как я иду. Все, что я обнаружил в преобразовании Unpivot, похоже, то, что мне нужно, но я не смог понять, как получить его в Unpivot на основе ИМЯ столбца («FreeText1» и т. Д.), И я не смог чтобы полностью понять, как настроить преобразование Unpivot, чтобы даже приблизиться к желаемым результатам.

Я еще не нашел каких-либо формул SSIS, которые я мог бы использовать в производном столбце, чтобы получить имя столбца программным путем, думая, что я мог бы сгенерировать имена столбцов в производном столбце, а затем объединить их вместе ... но это не похоже на очень эффективный метод, и я не мог заставить его работать в любом случае. Я попытался создать Derived Column, чтобы возвращать имена столбцов в жестком коде (например, используя «FreeText1» в качестве формулы), однако я не уверен, как объединить это с результатами Unpivoted.

Любой вход был бы рад!

ответ

1

Вы можете использовать преобразование UNPIVOT, который должен выглядеть что-то вроде

enter image description here

Или вы можете загрузить данные в промежуточную таблицу и использовать функцию TSQL UNPIVOT:

SELECT upvt.AccountID, upvt.Title, upvt.TheData 
FROM dbo.StagingTable AS t 
UNPIVOT (Title FOR TheData IN (FreeText1, FreeText2, FreeText3, FreeText4)) AS upvt; 

Или немного длиннее намотанный, но более гибким является использование CROSS APPLY вместе с table value constructor для получения информации. например

SELECT t.AccountID, upvt.Title, upvt.TheData 
FROM dbo.StagingTable AS t 
     CROSS APPLY 
     (VALUES 
      ('FreeText1', FreeText1), 
      ('FreeText2', FreeText2), 
      ('FreeText3', FreeText3), 
      ('FreeText4', FreeText4) 
     ) AS upvt (Title, TheData); 
+0

Это сработало отлично! Огромное спасибо! – LegalEagle

0

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

Загрузить данные в временную таблицу и выполнить следующий запрос к нему:

Select * From 
    (
    Select AccountID, 'FreeText1' Title, FreeText1 TheData From TableA 
    Union All 
    Select AccountID, 'FreeText2' Title, FreeText2 TheData From TableA 
    Union All 
    Select AccountID, 'FreeText3' Title, FreeText3 TheData From TableA 
    Union All 
    Select AccountID, 'FreeText4' Title, FreeText4 TheData From TableA 
    ) A 
Order By AccountID, Title 
Смежные вопросы