2016-10-26 8 views
3

現在、SQL Serverの問題に直面していますが、特定のプロシージャを自動化するという点でスケーラビリティに関する知識が不十分なのかもしれません。だから私は、次が可能であるかどうかを知りたいのです:構造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演算子を使用することができます。あなたが記述した形状は、NAPPLY句の行が必要です。ここで、Nは関係する列の数です。元のテーブルの各行に論理がAPPLY単にこの構成により

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) 

私たちがすることができます:我々は単にN - 1回反復し、各反復で新しい列nullを作る完全な行で始まります。

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); 

これは、単一のパスで起こるべきとあなたが本当にここにやっているすべてはbの行でaの行を乗じて、元の集合の濃度を変化させています。

関連する問題