我有一个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
答案 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;
答案 1 :(得分:-1)
在您的订单中,您可以执行以下操作吗?
ORDER BY
CASE WHEN [Ks2ma]=NULL OR [Ks2ma]='' THEN -1 ELSE [Ks2en] END
即。总是强制'No KS2'是一个你知道的值将高于其他值(基于你的数据集)。这只需要在ORDER BY
中完成