2008-12-08 172 views
1

我有一個日誌表,它有三列。一列是唯一標識符,一列稱爲「名稱」,另一列爲「狀態」。
名稱列中的值可以重複,以便您可以在多行中看到名稱「Joe」。名字「Joe」可能有一行狀態爲「open」,另一行狀態爲「closed」,另一行爲「waiting」,也可能爲「hold」狀態。我希望在這個最高到最低的順序(「關閉」,「保持」,「等待」和「打開」)中使用定義的優先級,爲每個名稱拉最高排名的行並忽略其他。任何人都知道簡單的方法來做到這一點?SQL優先級查詢

BTW,不是每一個名稱將所有狀態的表示,所以「喬」可能只具有「等待」和「持有」,或者只是「等待」一行。

回答

4

我會創建一個名爲類似「Status_Precedence」第二個表,與像行:

Status | Order 
--------------- 
Closed | 1 
Hold | 2 
Waiting | 3 
Open | 4 

在你的其他表的查詢,做一個連接到這個表(上Status_Precedence.Status),然後就可以ORDER BY Status_Precedence.Order

+0

我同意這將基本上對我的姓名和狀態進行排序,但是如何才能只保留每個姓名的最高號碼行? – madcolor 2008-12-08 15:52:55

4

如果你不想再創建一個表,你可以使用SELECT CASE

Select Name, Status, Case Status 
     When 'Closed' then 1 
     When 'Hold' then 2 
     When 'Waiting' then 3 
     When 'Open' Then 4 
     END 
     as StatusID 

     From Logging 
Order By StatusId -- Order based on Case 

查找表也是一個很好的解決方案,雖然數字分配優先級。

0

我結束了使用亞光B的解決方案,並使用這個最終的查詢篩選出排名較低(更低兵較高編號)。

SELECT * from [TABLE] tb 
LEFT JOIN Status_Precedence sp ON tb.Status = sp.Status 
WHERE sp.Rank = (SELECT MIN(sp2.rank) 
       FROM[Table] tb2 
      LEFT JOIN Status_Precedence sp2 ON tb2.Status = sp2.Status 
       WHERE tb.Status = tb2.Status) 
order by tb.[name]