Как преобразовать столбцы в строки на сервере sql

Я пытаюсь взять необработанный набор данных, который добавляет столбцы для новых данных, и преобразовать его в более традиционную структуру таблицы. Идея состоит в том, чтобы скрипт извлек имя столбца (дату) и поместил его в новый столбец, а затем сложил значения данных каждой даты друг над другом.

Пример

Store     1/1/2013     2/1/2013
XYZ INC   $1000        $2000

To

Store     Date         Value
XYZ INC   1/1/2013     $1000
XYZ INC   2/1/2013     $2000

Благодарность


person user3166445    schedule 06.01.2014    source источник
comment
Строго говоря, выглядит просто. Если вы можете показать нам, как сейчас хранятся данные (определения таблиц) или показать нам, что у вас уже есть, мы можем показать вам, как этого достичь.   -  person RBarryYoung    schedule 06.01.2014


Ответы (3)


Есть несколько различных способов получить желаемый результат.

Вы можете использовать SELECT с UNION ALL:

select store, '1/1/2013' date, [1/1/2013] value
from yourtable
union all
select store, '2/1/2013' date, [2/1/2013] value
from yourtable;

См. SQL Fiddle с демонстрацией.

Вы можете использовать функцию UNPIVOT:

select store, date, value
from yourtable
unpivot
(
  value
  for date in ([1/1/2013], [2/1/2013])
) un;

См. скрипт SQL с демонстрацией.

Наконец, в зависимости от вашей версии SQL Server вы можете использовать CROSS APPLY:

select store, date, value
from yourtable
cross apply
(
  values
    ('1/1/2013', [1/1/2013]),
    ('2/1/2013', [2/1/2013])
) c (date, value)

См. скрипт SQL с демонстрацией. Все версии дадут результат:

|   STORE |     DATE | VALUE |
|---------|----------|-------|
| XYZ INC | 1/1/2013 |  1000 |
| XYZ INC | 2/1/2013 |  2000 |
person Taryn    schedule 08.01.2014

В зависимости от деталей проблемы (т. е. исходного формата, количества и изменчивости дат, того, как часто вам нужно выполнять задачу и т. д.), вполне может быть намного проще использовать какой-либо другой язык для анализа данных и выполнения либо функция переформатирования или прямая вставка в итоговую таблицу.

Выше было сказано, что если вы заинтересованы в полностью SQL-решении, похоже, вы ищете некоторые динамические функции поворота. Ключевые слова dynamic SQL и unpivot. Детали зависят от того, какую СУБД вы используете, и от того, каковы спецификации исходного набора данных.

person chezy525    schedule 06.01.2014
comment
Очень редко поворот или разворот должен быть динамическим, и нет ничего, что указывало бы на необходимость динамического решения вопроса. - person Hogan; 07.01.2014
comment
@ Хоган, ты прав, в этом вопросе очень мало подробностей. Однако я полностью не согласен с вашей оценкой того, что поворот/разворот редко бывает динамическим. Хотя здесь это может и не понадобиться, есть очень четкое указание на то, что несводные столбцы изменяются довольно часто. Итак, если вы не любите постоянно пересматривать код, который вы пишете, небольшой динамический SQL может аккуратно решить эту проблему. - person chezy525; 07.01.2014

Я бы использовал язык сценариев (Perl, Python и т. д.), чтобы сгенерировать оператор INSERT для каждого столбца даты, который у вас есть в исходных данных, и перенести его в строку с ключами Store и Date. Затем запустите вставки в нормализованную таблицу.

person amphibient    schedule 06.01.2014
comment
Это не имеет смысла, зачем использовать язык сценариев, когда поворот можно сделать на SQL? - person Hogan; 06.01.2014