SQL指定ORDER BY结果集的顺序

时间:2013-10-02 16:49:12

标签: sql sql-server-2008 sql-order-by

我有一个ORDER BY子句,用于对分组值的结果集进行排序。

我希望ORDER By做的是导致No KS2行位于顶部。

这些值是从三个不同的列有条件地填充的,但这些值来自所有三列的相同集合。

值为null,长度为零的字符串,1c,1b,1a,2c,2b,2a,3c .... 5a,6c,6b,6a

目前,我的ORDER BY子句通过在值的左侧和值DESC的右侧进行排序来显示值。

示例结果集将是:

2a
3c
3b
4c
4b
4a
5c
5b
No KS2

这是我想要的一个例子:

No KS2
2a
3c
3b
4c
4b
4a
5c
5b

我目前的代码在这里:

ORDER BY
LEFT(
CASE Name
    WHEN 'English' THEN
        CASE WHEN [Ks2en]=NULL OR [Ks2en]='' THEN
            'No KS2'
        ELSE
            [Ks2en]
        END
    WHEN 'Mathematics' THEN
        CASE WHEN [Ks2ma]=NULL OR [Ks2ma]='' THEN
            'No KS2'
        ELSE
            [Ks2ma]
        END
    ELSE
        CASE WHEN [Ks2av]=NULL OR [Ks2av]='' THEN
            'No KS2'
        ELSE
            [Ks2av]
        END
    END,1),
RIGHT(
CASE Name
    WHEN 'English' THEN
        CASE WHEN [Ks2en]=NULL OR [Ks2en]='' THEN
            'No KS2'
        ELSE
            [Ks2en]
        END
    WHEN 'Mathematics' THEN
        CASE WHEN [Ks2ma]=NULL OR [Ks2ma]='' THEN
            'No KS2'
        ELSE
            [Ks2ma]
        END
    ELSE
        CASE WHEN [Ks2av]=NULL OR [Ks2av]='' THEN
            'No KS2'
        ELSE
            [Ks2av]
        END
    END,1) DESC

2 个答案:

答案 0 :(得分:4)

将查询的案例输出放在子查询中,然后在外部查询上检查它,以便您可以先订购它(使用常量)。这可以防止您不得不在CASE中重复那个混乱的ORDER BY条件(我假设SELECT列表中也存在相同或类似的条件)。这不会完全映射到您的代码(特别是因为我们没有您的所有代码),但应该提出一个想法:

SELECT Ks2en /* , other columns */
FROM
(
  SELECT Ks2en = CASE WHEN Ks2en = 'x' THEN 'No KS2' ELSE Ks2en END
    /* , other columns */
  FROM ...your query...
) AS x
ORDER BY CASE WHEN Ks2en = 'No KS2' THEN 'a' ELSE 'b' END, Ks2en;

http://sqlfiddle.com/#!3/128df/2

答案 1 :(得分:-1)

在您的订单中,您可以执行以下操作吗?

ORDER BY
    CASE WHEN [Ks2ma]=NULL OR [Ks2ma]='' THEN -1 ELSE [Ks2en] END

即。总是强制'No KS2'是一个你知道的值将高于其他值(基于你的数据集)。这只需要在ORDER BY

中完成