2012-12-23 181 views
3

我有一張表,其中包含部分數據,如下所示。我已通過edition_id完成了排序。 現在還需要訂購laungauge_id,這取決於edition_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 

如何做到這一點?請幫忙。

是這樣possibe

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

那麼規則是什麼? – xdazz

+0

先生,我上面提到的規則.. –

+0

是的,但爲什麼'13,1,2'和'13,5,1,4'?硬編碼? – xdazz

回答

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 

這樣就可以在將來添加其他規則,這是不區分邏輯的一個巨大的混亂。

或者,如果您想避免JOIN,則可以創建一個存儲函數,它執行類似的查找並返回一個排名(基於傳遞的EDITION_ID和LANGUAGE_ID的參數)。

如果您必須使用CASE,那麼我將它限制在一個函數中,以便您可以在別處重新使用該邏輯。

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 
1


如果你不能做到這一點,你可以簡單地爲這樣的關係,打出來的規則。
假設第一標準是LANGUAGE_ID的長度,
二是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 
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