2010-07-08 91 views
2

我做了另一個線程解決了我的問題,但我得到了報告審查,他們希望它的修訂。我會盡我所能來解釋:排序愛可信sql查詢

考慮以下幾點:

alt text

我需要的只是ORDER BY的SQL查詢的一部分。這三個字段是ACRNo,TypePty

  1. 我希望它按類型排序第一。

  2. 然後我想讓它按Pty排序,但是我希望空白的結尾。和排序的頂部。 (一個正常的orderby把空白的頂部)。

  3. 已經被排序之後,我想了ACR數字是排序所有空白PTY。當他們有一個pty連接到他們時,我不希望ACR被排序(或者我真的不在乎)。然而,當Pty是空白的時候,我想要最高的頂部。

我希望這是有道理的。

回答

3

有可能是一個更好的辦法,但這裏的,應該工作,除非你有控股的開始帶着一幫個Z的hackish的方法:

order by Type, Pty + 'zzz',ACRNo desc 
在查詢表達式「CASE
+0

哇,那工作。你能解釋一下嗎? nvmd,我明白了! – masfenix 2010-07-08 18:50:42

+0

嗯,唯一不直截了當的是Pty排序,你希望空白最後到達...所以你把一個'zzz'連接到一切,現在'apple'變成'applezzz',''變成'zzz',所以alpha排序給你你想要的。 – heisenberg 2010-07-08 18:53:31

+0

只要確保你從未有任何Pty值爲zzz的行;) – 2010-07-08 19:09:24

2
ORDER BY 
    type, 
    IIF(pty IS NULL, 1, 0), 
    pty, 
    acrno 

這裏假設「blank PTY」表示NULL。如果你想實際的空字符串是在底部還有那麼你需要稍微改變它:在列

ORDER BY 
    type, 
    IIF(NZ(pty, '') = '', 1, 0), 
    NZ(pty, ''), 
    acrno 

SQL排序(或表達式)在它們的順序列出的順序BY子句。因此,上面將首先按「type」排序,然後對於「type」具有相同值的行,它將按IIF()語句進行排序。在這種情況下,如果Pty沒有值,則IIF()返回1,否則返回0.因此,非值Pty行將按值排序。然後繼續按Pty(ORDER BY中所有先前的表達式具有相同的值)進行排序,如果它們具有相同的Pty值,則進行ACRNo排序。

+0

語法錯誤(缺少運算符)當[排名] IS NULL THEN 1 ELSE 0 END'。 我該如何調整? – masfenix 2010-07-08 18:49:28

+0

嘿,我用kekekela的答案。但是如果我可以避免這種駭人聽聞的方式,那就太棒了。 – masfenix 2010-07-08 18:51:06

+0

@masfenix - 我不認爲Access有Case語句,你可能需要類似 Switch(pty爲null,1,pty不爲null,0)...或者沿着這些行的東西,已經有很多年了,我用它 – heisenberg 2010-07-08 18:57:48