「注文方法」の概念を誤解しているようです。
この構造とデータのテーブルがあります。
CREATE TABLE TestTest (Value1 Int, Value2 Int);
INSERT INTO TestTest VALUES
(1, 10),
(2, 9),
(3, 8),
(4, 7),
(5, 6),
(6, 5),
(7, 4),
(8, 3),
(9, 2),
(10, 1)
;
以下のクエリでは:
Select Value1 , Value2
from TestTest
order by Value1 desc,Value2 desc
両方の列を期待しますValue1
およびValue2
10から1まで。両方の列にDESC
を使用しているためです。
しかし、私はこの出力を見ます:
なぜValue2
も降順ですか?
各列を個別にではなく、データの行を並べ替えます。
ORDER BY
句があるため、行(10、1)は行(1、10)の前にあります。
Value2
は、最初の列に同点がある場合にのみ機能します。
Hellion でさらに説明されているように、データベースに関する限り、ペア(10、1)はindivisible単位です:2つの値ではなく、1つのセットです(たまたま2つの値が含まれています)。セットを分割して別のセットに入れ替えることはできません。私が言ったように(そしてDarkoが別の答えで示しているように)、ORDER BY
句は最初に指定された列(Value1
)でソートし、Value1
に同じ番号の行が複数ある場合は、その行のサブセットをソートしますValue2
による。
別の例として、 A C によって提案された例を検討することもできます。
辞書が単語を並べ替える方法も参照してください:AA、AB、AC、BA、BB、BC、CA、CB、CC ...次に、最初の文字を最初の列の値(1桁以上の場合でも)で置き換え、 2番目の列の値を持つ2番目の文字とそこに行く-同じ原則。 (はい、わかりやすくするためにASCendingで並べ替えました-DESCendingで並べ替えられた辞書を見つけるのは困難です。)
たとえば、value1が10に等しい複数の行がある場合、ORDER句の2番目の部分は期待どおりに行われます。
次のスニペットを検討してください。ここでは、value1が10に等しい3つの行が存在します。
DECLARE @test AS TABLE
(
value1 int, value2 int
);
INSERT INTO @test
VALUES( 10, 1 ), ( 9, 2 ), ( 8, 3 ), ( 7, 4 ), ( 6, 5 ), ( 5, 6 ), ( 4, 7 ), ( 3, 8 ), ( 2, 9 ), ( 1, 10 ), ( 10, 2 ), ( 10, 3 );
SELECT *
FROM @test
ORDER BY value1 DESC, value2 DESC;
以下の画像に出力を示します。
より具体的な例を使用してみましょう。
いくつかのダミーデータを含むテーブルを作成します。
CREATE TABLE [PurchaseHistory](
[CustomerName] VARCHAR(50),
[Item] VARCHAR(50),
[Quantity] INTEGER
);
INSERT INTO [PurchaseHistory]
([CustomerName],[Item],[Quantity])
VALUES
('ZZ Top','Shampoo (Beard Wash) 16oz',3),
('ABC Stores','Fruit Punch 8oz',30),
('Nicolas Cage','Beekeeper suit',1);
アイテム/数量DESCでこれを選択した場合、何が出ると思いますか?
SELECT [CustomerName],[Item],[Quantity]
FROM [PurchaseHistory]
ORDER BY
[CustomerName] ASC,
[Item] DESC,
[Quantity] DESC
;
あなたの質問の例では、あなたはそれが次のようになると期待しているようです:
突然、あなたの記録は、ABCストアがビアードウォッシュを30本購入したことを示しています。
代わりに、ORDER BYを使用すると、行の値が一緒に保持されるため、ABCストアがまだ30ボトルのフルーツパンチを購入している正しいデータセットが得られ、ニックケージは養蜂家のスーツを取り、ZZトップはきれいな顔の毛を持ち続けます。
実際にORDER BYだけで2つの列を同時に並べることはできませんが、望ましい出力を得るには、共通テーブル式内で次のようにします。
CREATE TABLE #test
(
int1 int
, int2 int
)
INSERT INTO #test (int1, int2)
VALUES (1,10), (2,9), (3,8), (4, 7), (5, 6), (6,5), (7, 4), (8, 3), (9, 2), (10, 1)
;WITH CTE
AS
(
SELECT
int1
, int2
, ROW_NUMBER() OVER (order by int1 DESC) int_1
, ROW_NUMBER() OVER (order by int2 DESC) int_2
FROM #test
)
SELECT c.int1, int1.int2 FROM cte c
JOIN CTE int1 ON c.int_1 = int1.int_2
DROP TABLE #test
並べ替えでは、列の値ではなくレコードを並べ替えます。
複数の列を指定すると、結果セットは最初の列で並べ替えられ、最初の列に同じ値を持つ行の場合、並べ替えられた結果セットは2番目の列で並べ替えられます。
列型データベース/テーブルを考えています(列型データベースはデータを行ではなく列に格納します)。そこにあるRDBMの大部分とそのデフォルト設定では、データが行として格納されます(行指向データベース)。この場合、RDBMSは最初に、SQLステートメントで規定されているように、最初の列の降順の値に基づいて行をソートします。次に、2番目(Val2)に基づいて並べ替えます。ただし、あなたの場合、2つの列しかないため、これは役に立ちません。ただし、最初の順序と2番目の順序の並べ替えが必要な場合など、300列のテーブルを検討してください。 Excel言語では、1次、2次などと呼ばれます。