2016-10-26 3 views
3

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

У меня есть таблица, скажет:

AR_Code CD_code CO_Code Centre Cost 
    AL  3F2 811  ops floc 
    AL  3D2 812  ops cell 

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

AR_Code CD_code CO_Code Centre Cost 
AL  NULL  NULL NULL NULL 
AL  3F2  NULL NULL NULL 
AL  3F2  811  NULL NULL 
AL  3F2  811  ops NULL 
AL  3F2  811  ops floc 
AL  NULL  NULL NULL NULL 
AL  3D2  NULL NULL NULL 
AL  3D2  812  NULL NULL 
AL  3D2  812  ops NULL 
AL  3D2  812  ops cell 

Это почти создает шаг между полями. Кроме того, некоторые пакеты программного обеспечения для учета могут хранить данные. Мой текущий подход является кошмаром, и она включает в себя профсоюзы, будучи очень неприступным:

SELECT 
     AR 
     ,NULL as [CD code] 
     ,NULL as [CO Code] 
     ,NULL as [Centre ] 
     ,NULL as [Cost ] 
    FROM Table 
UNION ALL 
SELECT 
     AR 
     ,CD code as [CD code] 
     ,NULL as [CO Code] 
     ,NULL as [Centre ] 
     ,NULL as [Cost ] 
    FROM Table 
etc... 

Я не уверен, если кто-нибудь сталкивались с этой проблемой, или есть умный способ приблизиться к этому - я могу беспокоиться о заказе позже, но мой главный вопрос:

  • Есть ли более масштабируемый способ приблизиться к этому?

Спасибо.

-R

+0

Я не вижу проблем с вашим подходом. Это медленно? – sagi

+0

Вам нужно создать такой отчет или изменить способ хранения этих данных? Это одноразовая задача? –

+0

['CUBE'] (https://technet.microsoft.com/library/bb522495) с помощью фиктивного агрегата может помочь. –

ответ

1

Вы можете использовать оператор APPLY перенести значения в форму, которую вы ищете. Описанная вами форма требует N строк в предложении APPLY, где N - количество задействованных столбцов. Начиная с полными подряд мы просто перебирать N - 1 раз и сделать новый столбец null в каждой итерации:

0. (AR_Code, CD_code, CO_Code, Centre, Cost) 
1. (AR_Code, CD_code, CO_Code, Centre, null) 
... 
4. (AR_Code, null, null, null, null) 

При такой конструкции мы можем просто APPLY логики для каждой строки в исходной таблице.

select b.* 
from (values 
    (N'AL', N'3F2', N'811', N'ops', N'floc') 
    , (N'AL', N'3D2', N'812', N'ops', N'cell') 
) as a (AR_Code, CD_code, CO_Code, Centre, Cost) 
cross apply (values 
    (a.AR_Code, null, null, null, null) 
    , (a.AR_Code, a.CD_code, null, null, null) 
    , (a.AR_Code, a.CD_code, a.CO_Code, null, null) 
    , (a.AR_Code, a.CD_code, a.CO_Code, a.Centre, null) 
    , (a.AR_Code, a.CD_code, a.CO_Code, a.Centre, a.Cost) 
) as b (AR_Code, CD_code, CO_Code, Centre, Cost); 

Это должно произойти в один проход и все, что вы действительно делаете здесь меняется мощность исходного множества путем умножения строк в a строками в b.