SQL查询无法处理ORDER BY

时间:2015-09-22 23:21:37

标签: sql sql-server

我有一个SQL表,我正在尝试查询并命令返回。我能够查询得很好,我正在使用的SQL语句也在使用我需要执行的最后一个ORDER BY语句的例外。排序顺序如下:

  1. 对“状态”列进行排序,使“打开”位于顶部,“关闭”位于底部
  2. 订购'Flag'列,以便空(null)值位于底部(Status = Closed上方),值位于顶部
  3. 按编号栏
  4. 订购第1项和第2项的结果

    以下是原始数据的示例:

    | Flag | Number | Status |
    |------------------------|
    | a    |    1   |  open  |
    |      |    5   |  open  |
    |      |    3   | closed |
    | a    |    4   |  open  |
    | a    |    2   | closed |
    

    以下是我的目标:

    | Flag | Number | Status |
    |------------------------|
    |  a   |    1   |  open  |
    |  a   |    4   |  open  |
    |      |    5   |  open  |
    |  a   |    2   | closed |
    |      |    3   | closed |
    

    我正在使用的查询语句如下:

    sqlCom.CommandText = "SELECT * FROM Questions 
        WHERE Identifier = @identifier 
        AND Flag <> 'DELETED' 
        ORDER BY Status DESC
        , (CASE WHEN Flag is null THEN 1 ELSE 0 END) ASC
        , Flag DESC
        , [Number] * 1 ASC";
    

    现在,一切正常,但上面的第3项(按数字列排序)不起作用。有什么想法吗?

    我目前得到的是什么:

    | Flag | Number | Status |
    |------------------------|
    |  a   |    4   |  open  | <-- Out of order. Should be below the next record
    |  a   |    1   |  open  | <-- Out of order. Should be one record up
    |      |    5   |  open  | <-- OK
    |      |    6   |  open  | <-- OK
    |      |    3   | closed | <-- OK
    |  a   |    2   | closed | <-- OK
    

    提前感谢任何有用的输入。我试图在SSMS中摆弄查询,但没有运气。

1 个答案:

答案 0 :(得分:3)

您的第三个排序表达式位于Flag。在QNumber排序适用之前,这些值按字母顺序排序。请注意,案例在订购中也很重要。

以下是我的写作方式:

ORDER BY
    Status DESC, -- might be better to use a case expression
    CASE WHEN Flag IS NOT NULL THEN 0 ELSE 1 END,
    QNumber

由于示例中的数据与屏幕截图中的数据相矛盾,因此不清楚是否需要完全删除第三个排序列,或者只是忽略文本的大小写。