0

グループ化された値の結果セットを並べ替える ORDER BY 句があります。

ORDER By でやりたいことは、No KS2 行が一番上になることです。

値は 3 つの異なる列から条件付きで取り込まれますが、値は 3 つの列すべてで同じセットからのものです。

値は 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
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 に答える