web-dev-qa-db-ja.com

ORDER BY句の最初の列のみがソートされます

「注文方法」の概念を誤解しているようです。

この構造とデータのテーブルがあります。

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を使用しているためです。

しかし、私はこの出力を見ます:

Value1 in descending order, Value2 not

なぜValue2も降順ですか?

4
Pantea Tourang

各列を個別にではなく、データの行を並べ替えます。

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で並べ替えられた辞書を見つけるのは困難です。)

24
Michael Kutz

たとえば、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;

以下の画像に出力を示します。

enter image description here

SELECTの詳細情報-ORDER BY句(Transact-SQL)

12
user179264

より具体的な例を使用してみましょう。

いくつかのダミーデータを含むテーブルを作成します。

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);

Dummy data

アイテム/数量DESCでこれを選択した場合、何が出ると思いますか?

SELECT [CustomerName],[Item],[Quantity]
FROM [PurchaseHistory]
ORDER BY
    [CustomerName] ASC,
    [Item] DESC,
    [Quantity] DESC
;

あなたの質問の例では、あなたはそれが次のようになると期待しているようです: Clean beards

突然、あなたの記録は、ABCストアがビアードウォッシュを30本購入したことを示しています。

代わりに、ORDER BYを使用すると、行の値が一緒に保持されるため、ABCストアがまだ30ボトルのフルーツパンチを購入している正しいデータセットが得られ、ニックケージは養蜂家のスーツを取り、ZZトップはきれいな顔の毛を持ち続けます。

Boring

7
ap55

実際に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

出力: Output

2
Deen

並べ替えでは、列の値ではなくレコードを並べ替えます。

複数の列を指定すると、結果セットは最初の列で並べ替えられ、最初の列に同じ値を持つ行の場合、並べ替えられた結果セットは2番目の列で並べ替えられます。

2
shilan

列型データベース/テーブルを考えています(列型データベースはデータを行ではなく列に格納します)。そこにあるRDBMの大部分とそのデフォルト設定では、データが行として格納されます(行指向データベース)。この場合、RDBMSは最初に、SQLステートメントで規定されているように、最初の列の降順の値に基づいて行をソートします。次に、2番目(Val2)に基づいて並べ替えます。ただし、あなたの場合、2つの列しかないため、これは役に立ちません。ただし、最初の順序と2番目の順序の並べ替えが必要な場合など、300列のテーブルを検討してください。 Excel言語では、1次、2次などと呼ばれます。

1
LearnByReading