2017-06-22 5 views
2

In meiner Tabelle habe ich diese beiden Spalten und season genannt, nach denen ich sortieren möchte. Ein Beispiel für ihre Werte könnte seinBenutzerdefinierte Sortierung mit zwei verschiedenen Spalten sql

---------------------------- 
| id | etc | year | season | 
| 0 | ... | 2016 | FALL | 
| 1 | ... | 2015 | SPRING | 
| 2 | ... | 2015 | FALL | 
| 3 | ... | 2016 | SPRING | 
---------------------------- 

Wie würde ich eine Auswahl durchführen, wo ich die Ergebnisse als solche bekomme?

| 1 | ... | 2015 | SPRING | 
| 2 | ... | 2015 | FALL | 
| 3 | ... | 2016 | SPRING | 
| 0 | ... | 2016 | FALL | 

Der einfache Teil ORDER BY table.year ASC sein würde, aber wie verwalte ich die jetzt Jahreszeiten? Danke für irgendwelche Tipps!

Antwort

2

Sie können dies tun:

SELECT * 
FROM yourtable 
ORDER BY year, CASE WHEN season = 'spring' THEN 0 ELSE 1 END; 

Wenn Sie das gleiche für die beiden anderen Jahreszeiten tun möchten, können Sie das gleiche tun CASE verwenden, aber es wird viel einfacher und besser lesbar verwenden, um eine Tabelle etwas wie folgt aus:

SELECT t1.* 
FROM yourtable AS t1 
INNER JOIN 
(
    SELECT 'spring' AS season, 0 AS sortorder 
    UNION 
    SELECT 'Fall' AS season, 1 AS sortorder 
    UNION 
    SELECT 'Winter' AS season, 2 AS sortorder 
    UNION 
    SELECT 'summer' AS season, 3 AS sortorder 
) AS t2 
ORDER BY t1.year, t2.season; 
+0

Dank! Wie würde ich das anpassen, wenn ich mich für eine andere Saison entscheide? Um es "Frühling -> Sommer -> Herbst" zu machen, würde ich tun: 'ORDER BY Jahr, CASE WANN Saison = 'Frühling' THEN 0 ELSE 1 END, FALL WENN Saison = 'Sommer' THEN 0 ELSE 1 END'? –

+0

@SyntacticFructose, können Sie einen 'IN'-Operator eher wie' CASE WANN Jahreszeit IN ('Frühling', 'Sommer') ... ' – Rahul

+0

@SyntacticFructose - siehe meine aktualisierte Antwort –

1

Wenn Sie durch alle vier Jahreszeiten bestellen möchten, mit Frühling beginnen, erweitern CASE-Anweisung:

ORDER BY CASE season 
    WHEN 'spring' then 1 
    WHEN 'summer' then 2 
    WHEN 'fall' then 3 
    WHEN 'autumn' then 3 
    WHEN 'winter then 4 
    ELSE 0 -- Default if an incorrect value is entered. Could be 5 
END 

Alternativ können Sie, um alle möglichen Fälle zu behandeln, eine Tabelle mit dem Namen der Jahreszeit und einer Sortierreihenfolge erstellen. Angenommen, einige Ihrer Daten waren auf Deutsch. Sie könnten einen Tisch - SeasonSort - mit den Feldern SeasonName und SortOrder haben. Dann werden die Daten hinzufügen:

CREATE TABLE SeasonSort (SeasonName nvarchar(32), SortOrder tinyint) 
INSERT INTO SeasonSort (SeasonName, SortOrder) 
VALUES 
    ('spring', 1), 
    ('frühling', 1), 
    ('fruhling', 1), -- Anglicized version of German name 
    ('summer', 2), 
    ('sommer', 2), 
    ('fall', 3), 
    ('autumn', 3), 
    ('herbst', 3), 
    ('winter', 4) -- same in English and German 

dann Ihre Abfrage würde:

SELECT t.* 
FROM MyTable t 
LEFT JOIN seasonSort ss 
    ON t.season = ss.SeasonName 
ORDER BY t.Year, 
    isnull(ss.SortOrder, 0) 
Verwandte Themen