2016-06-15 6 views
0

У меня есть таблица, настроенная следующим образом.Таблица транспонирования в SQL

CustomerNumber June15_Order June15_Billing July15_Order July15_Billing August15_Order August15_Billing 
    12345   5    55   3    45 
    5431   6    66   5    67 

Я предпочел бы, чтобы это было:

CustomerNumber Date  Order Billing 
    12345  01/06/2015  5   55 
    12345  01/07/2015  3   45 
    5431  01/06/2015  6   66 
    5431  01/07/2015  5   67 

Любые мысли о том, как я бы точно перенести эту таблицу?

ответ

4

Если вы просто пытаетесь получить старые данные в новую, вы будете в основном нужно использовать грубую силу:

INSERT INTO NewTable 
    (CustomerNumber, [Date], [Order], Billing) 
    ( 
     SELECT CustomerNumber, '06/15/2015', June15_Order, June15_Billing 
     FROM OldTable 

     UNION 

     SELECT CustomerNumber, '07/15/2015', July15_Order, July15_Billing 
     FROM OldTable 

     UNION 

     SELECT CustomerNumber, '08/15/2015', August15_Order, August15_Billing 
     FROM OldTable 
    ) 
1

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

В столбцах, которые вы знаете, old_col для new_col только что берете значение и сохраняете в переменной, для остальных вам нужно создать условие для каждого месяца, как «содержит june», и сохранить в двух переменных дату и значение после что каждый раз, когда вы нашли новый месяц со значением> 0, выполните вставку в новую таблицу со всеми переменными.

1

Предполагая наличие столбцов в течение любого месяца и любых лет, это становится уродливым очень быстро. Если столбцы установлены и жестко закодированы, используйте решение @John Pasquet (+1). Если вам нужна возможность работать с любым набором столбцов формы MMMMDD_Type, вот схема.

Первый проход:

  • Написать SELECT... UNPIVOT... запрос, чтобы преобразовать таблицу
  • карте полученный столбец "метки" к дате типа данных и "Тип" (Order, биллинг)

Однако отображение результатов названий столбцов с "July15" до "1 июля 2015 года" (или 01/07/2015) сложно, если не сумасшедший. Это приводит к второму проходу:

  • Построить список «подстановок» столбцы из sys.tables и sys.colmns
  • Выбирает те, которые должны быть unpivoted
  • Выяснить даты и типов для каждый из них
  • построить SELECT... UNPIVOT... в динамическом SQL, демпинг результатов в временной таблицу
  • Join этой временной таблицы в список поиска по оригинальному имени столбца, который (через объединение) получает вас приготовленную дату и значение типа

Серьезно, это может стать смехотворно сложным. Интеллектуальные деньги - это перестроение таблиц со столбцами для даты и типа.

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