3

以下のようなデータの一部を含むテーブルがあります。edition_idで注文しました。ここで、edition_idの値に依存するlaungauge_idを注文する必要があります。

  • Edition_idは、新聞が発行された都市を指します。
  • Language_idは、新聞が発行されるさまざまな言語を指します。

それで、edition_id = 5それがニューデリーを意味するとします。
ニューデリーのlanguage_id場合、13(英語)、5(ヒンディー語)、1(テルグ語)、4(ウルドゥー語)です。

私が欲しいのはニューデリーに表示することです。最初にすべての英語の冠詞を表示し、次にヒンディー語、次にテルグ語、次にウルドゥー語を表示します。

edition_id = 1の場合、language_idの順序は13,1,2である必要があります。

同様に、

edition_id = 5の場合、language_idの順序は13,5,1,4である必要があります

今私が持っているのは

Edition_id | Language_id
1             1
1             2
1             13
1             1
1             13 
1             2
5             4
5             1
5             1
5             4
5             13
5             5
5             13 

必要なもの

Edition_id | Language_id
1             13
1             13
1             1
1             1
1             2 
1             2
5             13
5             13
5             5
5             1
5             1
5             4
5             4

これを行う方法 ?助けてください。

この可能性のようなものですか

Select * from <table>
order by edition_id ,
            case when edition=6 then <order specified for language_id ie 13,5,1,4>
4

4 に答える 4

5

補足のランキング表を作成します。次に、参加して並べ替え順序を提供します。例えば:

EDITION_SORT_ORDER

EDITION_ID  LANGUAGE_ID  RANK
----------  -----------  ----
1           13           1
1           1            2
1           2            3
5           13           1
5           5            2
5           1            3
5           4            4

クエリでこのテーブルを使用すると、次のようになります。

SELECT E.EDITION_ID, E.LANGUAGE_ID
FROM <TABLE> E LEFT OUTER JOIN EDITION_SORT_ORDER S ON
  E.EDITION_ID = S.EDITION_ID AND
  E.LANGUAGE_ID = S.LANGUAGE_ID
ORDER BY S.RANK

このようにして、将来的に他のルールを追加することができ、CASEロジックの大きな混乱ではありません。

または、JOINを回避したい場合は、同様のルックアップを実行してランクを返すストアド関数を作成できます(EDITION_IDおよびLANGUAGE_IDの渡されたパラメーターに基づく)。

CASEを使用する必要がある場合は、それを関数に限定して、ロジックを他の場所で再利用できるようにします。

于 2012-12-23T10:19:44.003 に答える
2

その背後に数学的論理がない場合は、適切な並べ替えに使用できる別の列を挿入します。
これができない場合は、次のように関係のルールを入力するだけです。

Order By Edition_Id,
case Edition_id
    when 1 then
        case Language_id
            when 13 then 1
            when 1 then 2
            when 2 then 3
        end
    when 5 then
        case Language_id
            when 13 then 1
            when 5 then 2
            when 1 then 3
            when 4 then 4
        end
end
于 2012-12-23T10:24:43.447 に答える
1

固定順序の列がないと、そのようなことができますが、ロジックは理解できません。
最初の基準がLanguage_idの長さであり、
2番目がEdition_id = Language_idであり、
残りがLanguage_idの順序であると仮定すると、次のように機能します。

Declare @t table(Edition_id  int, Language_id int)
insert into @t values
(1,             1),
(1,             2),
(1,             13),
(1,             1),
(1,             13), 
(1,             2),
(5,             4),
(5,             1),
(5,             1),
(5,             4),
(5,             13),
(5,             5),
(5,             13);

Select * from @t
order by Edition_id,Case when len (Cast(Language_ID as Varchar(10)))=1 then '1' else '0' end
                   +case when Edition_id=Language_id  then '0' else '1' end
                   ,Language_ID 
于 2012-12-23T10:33:20.993 に答える
1

あなたはおそらくこれを考慮しましたが、希望する順序が常に言語の実際のアルファベット名に基づいている場合は、通常、結合して並べ替えることができる言語の説明を含むテーブルがあります。私はこれを以下のあなたの引用に基づいています。

...最初に英語の冠詞、次にヒンディー語、次にテルグ語、次にウルドゥー語。

SELECT E.EDITION_ID, E.LANGUAGE_ID, LN.LANGUAGE_NAME
FROM <TABLE> E LEFT OUTER JOIN <LANGUAGE_NAMES> LN ON
E.LANGUAGE_ID = LN.LANGUAGE_ID
ORDER BY 1, 3
于 2012-12-23T18:35:36.723 に答える