0

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

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

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

值为空,长度为零的字符串,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
4

2 回答 2

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

于 2013-10-02T17:17:20.553 回答
-1

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

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

即始终强制“No KS2”成为您知道排序高于其他值的值(基于您的数据集)。这只需要在 ORDER BY 中完成

于 2013-10-02T16:56:07.453 回答