it-swarm.com.de

Nur die erste Spalte in der ORDER BY-Klausel wird sortiert

Es scheint, als hätte ich das Konzept von 'Order by' falsch verstanden.

Ich habe eine Tabelle mit dieser Struktur und Daten:

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

Mit der folgenden Abfrage:

Select Value1 , Value2
from TestTest
order by Value1 desc,Value2 desc

Ich erwarte beide Spalten Value1 und Value2 von 10 bis 1, weil ich DESC für beide Spalten verwende.

Aber ich sehe diese Ausgabe:

(Value1 in descending order, Value2 not

Warum ist nicht Value2 auch in absteigender Reihenfolge?

4
Pantea Tourang

Sie bestellen Datenzeilen, nicht jede Spalte einzeln.

Die Zeile (10, 1) steht aufgrund Ihrer ORDER BY - Klausel vor der Zeile (1, 10).

Der Value2 Kommt nur ins Spiel, wenn in der ersten Spalte ein Gleichstand besteht.

Wie weiter durch Hellion erklärt, ist das Paar (10, 1) in Bezug auf die Datenbank eine unteilbare Einheit : Es sind nicht zwei Werte, es ist eine Menge (die zufällig zwei Werte enthält). Sie können das Set nicht einfach in Stücke zerbrechen und die Stücke wohl oder übel in verschiedene Sets tauschen. Wie gesagt (und wie Darko in einer anderen Antwort zeigt), sortiert die Klausel ORDER BY Nach der ersten angegebenen Spalte (Value1) Und dann, wenn mehr als eine Zeile mit derselben Nummer vorhanden ist Value1 Sortiert diese Teilmenge von Zeilen nach Value2.

Als weitere Illustration können Sie auch das von A C vorgeschlagene Beispiel betrachten:

Siehe auch die Art und Weise, wie das Wörterbuch Wörter sortiert: AA, AB, AC, BA, BB, BC, CA, CB, CC ... Ersetzen Sie nun den ersten Buchstaben durch Ihren ersten Spaltenwert (auch wenn er mehr als eine Ziffer enthält) und den zweiter Buchstabe mit dem Wert der zweiten Spalte und los geht's - gleiches Prinzip. (Ja, ich habe ASCending aus Gründen der Übersichtlichkeit sortiert - DESCending sortierte Wörterbücher sind schwer zu finden.)

24
Michael Kutz

Wenn Sie beispielsweise mehrere Zeilen mit dem Wert 1 gleich 10 haben, wird der zweite Teil der ORDER-Klausel wie erwartet ausgeführt.

Betrachten Sie das folgende Snippet, in dem drei Zeilen mit dem Wert 1 gleich 10 vorhanden sind.

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;

Die Ausgabe ist im Bild unten dargestellt.

(enter image description here

Weitere Informationen zu SELECT - ORDER BY-Klausel (Transact-SQL)

12
user179264

Lassen Sie uns ein anschaulicheres Beispiel verwenden.

Erstellen Sie eine Tabelle mit einigen Dummy-Daten:

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

Wenn Sie dies mit Artikel-/Mengen-DESC ausgewählt haben, was erwarten Sie dann herauszukommen?

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

Mit dem Beispiel in Ihrer Frage scheinen Sie zu erwarten, dass es so herauskommt: Clean beards

Plötzlich deuten Ihre Unterlagen darauf hin, dass ABC-Läden 30 Flaschen Bartwäsche gekauft haben, Nicolas Cage eines Tages etwas durstig war und ZZ Top einen einzigen Bienenanzug zwischen ihnen teilt.

Stattdessen werden bei Verwendung von ORDER BY die Werte in einer Reihe zusammengehalten, was zu dem korrekten Datensatz führt, in dem ABC Stores noch 30 Flaschen Fruchtpunsch kauft, Nick Cage seinen Imkeranzug erhält und ZZ Top weiterhin sauberes Gesichtshaar hat .

(Boring

7
ap55

Sie können nicht wirklich mit ORDER BY allein nach zwei Spalten gleichzeitig bestellen, aber um zu Ihrer gewünschten Ausgabe zu gelangen, können Sie in Common Table Expressions Folgendes tun:

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

Ausgabe: Output

2
Deen

Sortieren Sie die Datensätze nach Sortierung, nicht nach den Spaltenwerten.

Wenn Sie mehrere Spalten angeben, wird die Ergebnismenge nach der ersten Spalte sortiert. Bei Zeilen mit demselben Wert in der ersten Spalte wird diese sortierte Ergebnismenge nach der zweiten Spalte usw. sortiert.

2
shilan

Sie denken an eine Spaltendatenbank/-tabelle (eine Spaltendatenbank speichert Daten in Spalten anstelle von Zeilen). Die überwiegende Mehrheit der RDBMs da draußen und ihre Standardeinstellung speichert Daten als Zeilen (zeilenorientierte Datenbank). In Ihrem Fall sortiert das RDBMS zuerst die Zeilen basierend auf den absteigenden Werten der ersten Spalte, wie in Ihrer SQL-Anweisung vorgeschrieben. Dann sortiert es es basierend auf dem zweiten (Val2). In Ihrem Fall ist dies jedoch nutzlos, da Sie nur zwei Spalten haben. Stellen Sie sich jedoch eine Tabelle mit 300 Spalten vor. In diesem Fall möchten Sie eine Sortierung erster und zweiter Ordnung. In der Excel-Sprache heißt das, was Sie tun, erste Ordnung, zweite Ordnung usw.

1
LearnByReading