2010-07-08 93 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