Hoe kan ik met SQL gegevens in 3 alfabetische subgroepen sorteren?

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 byclausule 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

Other episodes