【问题标题】:SQL Specify the order of ORDER BY result setSQL 指定 ORDER BY 结果集的顺序
【发布时间】:2013-10-09 03:46:53
【问题描述】:

我有一个 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

【问题讨论】:

  • 那么,那里有问题吗?
  • No KS2 是什么意思?
  • stackoverflow.com/questions/1250156/… -> 这应该会给你一些想法
  • 抱歉,伙计们,已经养成了从问题开始的习惯,而不是在我写帖子时从哪里开始。你会在大约一半的时候发现它,但是到那时你可能已经睡着了。修改答案以适应。
  • @dognose 让最终用户看到“No KS2”而不是空行更有意义。我所说的价值观是学生在小学结束时获得的成绩,小学的课程被称为关键阶段 2。

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


【解决方案1】:

将您的查询及其大小写输出放在子查询中,然后在外部查询中对其进行检查,以便您可以先对其进行排序(使用常量)。这可以防止您不得不在ORDER BY 中重复那个凌乱的CASE 条件(我认为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

【讨论】:

  • 是的,还有 GROUP BY。
  • @Matt 什么 GROUP BY?
  • 它不在我的示例中,但我指的是在问题中分组的结果集。我对您的回答很满意,只需稍等片刻即可试用。
【解决方案2】:

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

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

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

【讨论】:

  • (1) =NULL 应该是 IS NULL。 (2) -1 将导致转换错误,因为它会尝试将Ks2en 转换为INTCASE 表达式必须根据数据类型优先级折叠为兼容类型。
  • 哎呀——你是对的!我只是不假思索地复制了他的案例陈述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多