2016-07-08 15 views
1

いくつかの一般的な階層データに対していくつかの完全結合を行うクエリがあります。カテゴリにはグループがあり、グループにはアイテムがありますが、グループとアイテムはそれぞれカテゴリとグループに関連付けられていなくてもかまいません。SQL結果の階層的な番号付け

I. NULL 
    A. NULL 
    1. Item Orphan <-- no category or group 
    B. Group Red <-- no category 
    1. Item Apple 
    2. Item Banana 
II. Category Bacon 
    A. Group Blue 
    B. Group Taupe 
    1. Item Kiwi 
    2. Item Watermelon 
III. Category Atari 
    A. Group Silver 
IV. Category Maui 
... 

注:私が好きな結果は次のようになり、私は例を読みやすくするための番号の後にピリオドを追加しましたが、出力は彼らを持つ必要はありません。

今の結果は次のようになります。

Category Group Item 
NULL  NULL Orphan 
NULL  Red Apple 
NULL  Red Banana 
Bacon Blue NULL 
Bacon Taupe Kiwi 
Bacon Taupe Watermelon 
Atari Silver NULL 
Maui  NULL NULL 

そして、私は必要なのである:最後の行にAと行のIo列で1 S、けれども

Co Category Go Group Io Item 
I NULL  A NULL 1 Orphan 
I NULL  B Red 1 Apple 
I NULL  B Red 2 Banana 
II Bacon A Blue 1 NULL 
II Bacon B Taupe 1 Kiwi 
II Bacon B Taupe 2 Watermelon 
III Atari A Silver 1 NULL 
IV Maui  A NULL 1 NULL 

NULLの商品もあります。商品はNULLです。しかし、孤児アイテム行のIAは重要です。

edit:これは、わかりやすいように実際のコードから簡略化されています。私のケースでは、Itemは0個以上のSub-Itemsを持つことがあるので、CoGo、およびIoの値が単純に複製される各Itemに対して複数の行が存在する可能性があります。サブ項目には番号は付けられていないので、それらの序数の列はありません。だから、いくつかの完全な行の例は次のようになります。

Co Category Go Group Io Item  Supplier Supplier_phone 
I NULL  B Red 2 Banana  NULL  NULL 
II Bacon B Taupe 1 Kiwi  Steve  555-1234 
II Bacon B Taupe 1 Kiwi  Sally  555-4242 
II Bacon B Taupe 2 Watermelon NULL  NULL 

私の問題は2つあり:

  • 私は、階層のレベルごとに異なる番号を行うと、それはいつでもそのレベルがインクリメント持っていますか変更?
  • これらの数字を異なる序数のスペースに変換する(1,2,3をa、b、cまたはI、II、IIIに変換する)と、レベルごとに行う方法はありますか?

これはMS SQL Server 2012に含まれています。私はSQLにアクセスできるだけなので、T-SQLコードはありません。

参考のため、とWHEREの句は、私がDRYを保ちたいコードの約20行です。以前はCTEを使っていましたが、この場合に役立つかどうかはわかりません。

私はrow_number over (order by...を使用することに慣れていますが、私はこの場合どのように使用できるかわかりません。

+0

階層に 'items'より低いレベルはありませんか? –

+0

私は実際の使用事例から簡略化しましたが、はい、あります。それを反映するように質問を更新します。良いコール、これは大きな違いを生むかもしれない何かのような感じです。 – jinglesthula

答えて

2

グループ番号については、DENSE_RANKがほしいと思っています。グループを除いて、ROW_NUMBERと同じ方法で使用されます。

あなたの実際のコードを見ずに、それはのようになります:言っ

SELECT DENSE_RANK() over (ORDER BY Category) as Co, 
      Category, 
      DENSE_RANK() over (PARTITION BY Category, ORDER BY [Group]) as Go, 
      Group, 
      --etc 

、私はあなたが機能せずに数字/文字に数値を変換する方法は考えています。

+0

ありがとうございます!私は 'ROW_NUMBER'コードの中で私が実際にコピー/貼り付け/修正で使用したさまざまなキーワードを把握していませんでした。今度は、「区切り」と「順序付け」が「DENSE_RANK」と同様に何をするのかを最終的に理解しています。変換については、クエリ結果を消費するコードでこれを管理できると思いますが、もし私が次のようにしなければならない場合には、CASE文を使って限られた範囲で恐ろしい翻訳が行われる可能性があります。再度、感謝します。 – jinglesthula

+0

@ jinglesthula喜んでそれは助け、それらの 'aha'の瞬間が最高です。私は、コード内で翻訳が管理できることを願っています。 :D幸運。おかげさまで –

+1

私はコード内でローマ数字の翻訳をすることができました(ありがたいことに!)。私が書いたローマ数字のアルゴリズムは、グーグルで誰かを救うために、この1つのポートhttp://www.blackwasp.co.uk/NumberToRoman.aspx – jinglesthula

関連する問題