Ik geef leerlinggegevens voor docenten op mijn school weer met behulp van SQL, en om bruikbaarheidsredenen moet het worden weergegeven met een zeer unieke sortering, met 3 subsets van het alfabet die de dataset verdelen, en daarna de normale sortering daarbinnen.
>
Het zou zoiets als dit moeten uitspugen:
Achternamen A-F, gesorteerd op punt, dan op achternaam
Achternamen G-O, gesorteerd op punt, dan op achternaam
Achternamen P-Z, gesorteerd op punt, dan op achternaam
Het is momenteel vrij eenvoudig gesorteerd op punt en achternaam, en ik kan drie verschillende zoekopdrachten gebruiken om de gegevens als zodanig te splitsen, maar ik weet niet hoe ik dit allemaal in één moet doen.
SELECT * FROM Student ORDER BY per, last;
Antwoord 1, autoriteit 100%
Bent u op zoek naar een voorwaardelijke uitdrukking in de order by
?
order by (case when last < 'G' then 1
when last < 'P' then 2
else 3
end),
per, last
Antwoord 2
Misschien wil je iets als dit proberen:
SELECT
CASE
WHEN LEFT(UPPER(last), 1) BETWEEN 'A' AND 'F' THEN 1
WHEN LEFT(UPPER(last), 1) BETWEEN 'G' AND 'O' THEN 2
WHEN LEFT(UPPER(last), 1) BETWEEN 'P' AND 'Z' THEN 3
ELSE 4
END AS LETTER_GROUP,
per,
last
FROM
Student
ORDER BY 1,2,3;
Antwoord 3
Je kunt niet echt breken de set-up in groepen / partities resultaat. U kunt groep de set met een group by
clausule resultaten, maar dat vat samen tot een enkele rij per groep. Er is ook over/partition by
, maar dat is meer analytische. U wilt iets als dit te doen:
select group_1 = case
when upper(substring(t.surname,1,1)) between 'A' and 'F' then '1:A-F'
when upper(substring(t.surname,1,1)) between 'G' and 'O' then '2:G-O'
when upper(substring(t.surname,1,1)) between 'P' and 'Z' then '3:P-Z'
else '4:Other'
end,
*
from my_table t -- SORT SEQUENCE:
order by 1, -- 1. Ordinal Column 1 (grouping by letter of last name)
t.period, -- 2. Period
t.surname -- 3. Surname
U hoeft niet zeggen wat de smaak van SQL die u gebruikt. Afhankelijk van wat dialect uw DBMS spreekt, moet je de 1ste kolom
herformuleren
group_1 = case ... end
to be
case ... end as group_1