SELECT句にCASEWHEN条件を含めることで、そのようにソートされた理由を簡単に視覚化できます。
SELECT BusinessEntityID, SalariedFlag,
CASE SalariedFlag WHEN 1 THEN BusinessEntityID END AS A,
CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END AS B
FROM Employee
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC
,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;
出力:
BUSINESSENTITYID SALARIEDFLAG A B
7 1 7 (null)
5 1 5 (null)
3 1 3 (null)
1 1 1 (null)
2 0 (null) 2
4 0 (null) 4
6 0 (null) 6
8 0 (null) 8
SalariedFlag 0が一緒にとどまる理由は、それらがすべてnullに該当するためです(列Aを参照)。SalariedFlagに別の値(たとえば2)があり、そのクエリが機能しなくなった場合は、まったく別の問題になります。フラグは必ずしも互いに隣接しているとは限りません。
NULLで最初にソートします。DESCを指定すると、最後にソートされます。
ライブテスト:http ://www.sqlfiddle.com/#!3 / 1b849 / 13
そのクエリのCASEWHEN'STHENが整数型のBusinessEntityIDを使用していることを認識して、次のクエリを実行して同じ効果を得ることができます。また、SalariedFlagを分離子として使用するため、ORDER BYで条件を使用していないため、次のクエリの方が高速になる可能性があります。SalariedFlagを切り替えて、並べ替えることができます。
-- just to visualize things up
SELECT BusinessEntityID, SalariedFlag,
A = BusinessEntityID * SalariedFlag,
B = BusinessEntityID * (SalariedFlag ^ 1)
FROM Employee
ORDER BY A DESC, B
-- in actual you do this:
SELECT BusinessEntityID, SalariedFlag
FROM Employee
ORDER BY BusinessEntityID * SalariedFlag DESC, BusinessEntityID * (SalariedFlag ^ 1)
このデータを考えると:
CREATE TABLE [Employee]
([BusinessEntityID] int, [SalariedFlag] int);
INSERT INTO [Employee]
([BusinessEntityID], [SalariedFlag])
VALUES
(10, 1),
(5, 1),
(9, 1),
(1, 1),
(2, 0),
(7, 0),
(6, 0),
(8, 0);
これは出力です:
BUSINESSENTITYID SALARIEDFLAG A B
10 1 10 0
9 1 9 0
5 1 5 0
1 1 1 0
2 0 0 2
6 0 0 6
7 0 0 7
8 0 0 8
ライブテスト:http ://www.sqlfiddle.com/#!3 / e65ac / 2