Torna all'elenco degli articoli Articoli
Tempo di lettura: 6 minuti

Come ordinare i valori in un ordine specifico in SQL

A volte è necessario ordinare i dati in un modo particolare e spesso l'uso dei tipici modificatori di ordinamento come ASC e DESC non è sufficiente. Questo articolo vi mostrerà come utilizzare l'istruzione CASE per ordinare i dati esattamente come vi serve.

Vi è mai capitato di dover ordinare i dati in modo molto specifico? Uno dei metodi migliori per gestire un ordinamento complesso è l'utilizzo di CASE. L'istruzione CASE è molto utile perché consente di aggiungere la logica if-else alle query. Utilizzeremo questa logica SQL ORDER BY valori specifici. Per saperne di più sull'istruzione CASE, leggete questo articolo che spiega CASE e mostra esempi utili.

Dimostreremo questo ordinamento personalizzato SQL con 3 esempi distinti, che coinvolgono diversi tipi di dati come numeri interi, valori di testo e date.

Per i nostri esempi, utilizzeremo la tabella orders tabella. Questa tabella contiene informazioni sugli ordini di prodotti ricevuti dalla nostra azienda.

orders

idlocationcountorder_date
1New York132021-05-21
2Boston212020-11-12
3Chicago42021-03-18
4Toronto102019-12-13
5New York202020-01-27
6Boston332019-04-03
7Memphis72021-05-04
8Cleveland182020-07-06
9Philadelphia62019-04-22
10Washington352021-01-07

Ordinamento personalizzato basato sulla colonna Intero

Il nostro manager ci ha comunicato come vuole che siano ordinati i dati. Il nostro risultato deve rispettare le seguenti regole:

  • In primo luogo, mostrare gli ordini in cui sono stati ordinati tra 10 e 20 articoli.
  • Poi, mostrare gli ordini in cui sono stati ordinati meno di 10 articoli.
  • Infine, mostrare gli ordini che hanno superato i 20 articoli.

I requisiti sono abbastanza chiari, mettiamoci al lavoro! Dopo un po' di tempo, abbiamo prodotto la seguente query SQL:

SELECT id, count
FROM orders
ORDER BY CASE WHEN count BETWEEN 10 AND 20 THEN 1
              WHEN count < 10 THEN 2
              ELSE 3END

Scomponiamola.

Selezioniamo id e il numero di ordini da visualizzare. Dopodiché, ci occupiamo subito dell'ordine dei risultati utilizzando la clausola ORDER BY.

È possibile utilizzare CASE per specificare una chiave di ordinamento nella clausola ORDER BY, che è esattamente ciò che stiamo facendo qui. Al primo caso diamo il valore 1 come chiave di ordinamento:

CASE WHEN count BETWEEN 10 AND 20 THEN 1

Al secondo caso diamo il valore di 2 come chiave di ordinamento:

WHEN count < 10 THEN 2

In questo modo, i risultati del primo caso saranno mostrati prima del secondo caso. Gli ultimi dati che vogliamo siano visualizzati sono quelli in cui il conteggio degli ordini è superiore a 20. Possiamo assegnare loro un valore di chiave di ordinamento pari a 3.:

ELSE 3

Bene, eseguiamo la nostra query! Vengono restituiti i seguenti record:

idcount
113
410
520
818
34
77
96
221
633
1035

Ha funzionato! Gli articoli con un numero di ordini compreso tra 10 e 20 vengono mostrati per primi. Seguono gli ordini in cui sono stati ordinati 10 articoli. Infine, vengono mostrati gli ordini con numero di articoli superiore a 20.

Questo è un uso piuttosto avanzato di CASE. È possibile utilizzare l'istruzione CASE anche con comandi di modifica dei dati come INSERT e UPDATE. Se siete interessati a saperne di più, consultate questo post del blog sull'argomento.

Ordinamento personalizzato basato su una colonna di testo

Vediamo un altro esempio, ma questa volta useremo una colonna di testo per specificare l'ordine in cui devono apparire i dati.

Il nostro capo ci ha appena detto che dobbiamo visualizzare alcuni dati della nostra tabella e ordinarli in base alla località. orders tabella e ordinarli in base alla località in cui è stato effettuato l'ordine.

Il cliente vuole vedere prima gli ordini di New York, poi quelli di Boston e infine quelli di Toronto. Anche il resto degli ordini deve essere visualizzato, ma l'ordine non ha importanza per le altre località. Mettiamoci al lavoro.

Abbiamo ottenuto la seguente query:

SELECT id, location, count, order_date
FROM orders
ORDER BY CASE WHEN location = 'New York' THEN 1
              WHEN location = 'Boston' THEN 2
              WHEN location = 'Toronto' THEN 3
              ELSE 4 END

Questa volta selezioniamo tutte le colonne. L'uso di ORDER BY e CASE è simile a quello dell'esempio precedente. Se volete saperne di più su questo argomento, consultate questo articolo che tratta ampiamente i tipi di dati SQL.

Si noti che l'ordine utilizzato nell'espressione CASE WHEN corrisponde esattamente alle nostre esigenze, mostrando New York, Boston e poi Toronto. Eseguiamo questa query e vediamo se abbiamo successo.

idlocationcountorder_date
1New York132021-05-21
5New York202020-01-27
2Boston212020-11-12
6Boston332019-04-03
4Toronto102019-12-13
3Chicago42021-03-18
8Cleveland182020-07-06
7Memphis72021-05-04
9Philadelphia62019-04-22
10Washington352021-01-07

Successo! Questo è esattamente il modo in cui vogliamo che siano ordinati i nostri dati. Ora possiamo passare all'ultimo esempio. Finora abbiamo lavorato con i tipi di dati numero e testo.

Ordinamento personalizzato basato sulla colonna Data

Per il nostro ultimo esempio, utilizzeremo il tipo di dato data e dimostreremo come incorporare i valori della data negli ordinamenti personalizzati di CASE.

Un'altra richiesta è arrivata dal nostro manager. Vogliono che i dati siano visualizzati in un certo ordine basato sulla colonna Data, order_date. Ecco cosa ci è stato detto:

  • Visualizzare tutti gli ordini dell'anno in corso (2021) e ordinare queste date in base al mese e al giorno del mese in ordine crescente.
  • Successivamente, mostrare le date degli anni precedenti e ordinare anche queste in base al giorno e al mese.

Scriviamo la nostra query ed eseguiamo l'ultimo esempio di SQL ORDER BY CASE.

SELECT id, location, count, order_date
FROM orders
ORDER BY 
CASE WHEN EXTRACT(YEAR FROM order_date) = EXTRACT(YEAR FROM CURDATE()) THEN 1
     WHEN EXTRACT(YEAR FROM order_date) = (EXTRACT(YEAR FROM CURDATE()) - 1) THEN 2
     ELSE 3 
END ASC, order_date ASC

C'è molto da analizzare! Entriamo nel vivo. Esaminate il seguente frammento:

CASE WHEN EXTRACT(YEAR FROM order_date) = EXTRACT(YEAR FROM CURDATE()) THEN 1

EXTRACT è usato per ottenere l'anno dalla data dell'ordine. CURDATE() è usato per ottenere la data corrente. Altre funzioni come queste sono disponibili nel corso SQL Standard Functions, che insegna come elaborare dati numerici, di testo e di altro tipo con le funzioni più utilizzate di SQL.

Confrontiamo l'anno di order_date con l'anno della data corrente. Per fare in modo che questa serie di dati appaia per prima impostando la chiave di ordinamento a 1.

WHEN EXTRACT(YEAR FROM order_date) = (EXTRACT(YEAR FROM CURDATE()) - 1) THEN 2

Questa operazione è simile a quella dell'ultima sezione, tranne per il fatto che utilizziamo la data dell'anno scorso (YEAR FROM CURDATE()) - 1).

Infine, facciamo apparire il resto dei risultati utilizzando questo frammento:

ELSE 3

Questa volta, abbiamo anche ordinato per order_date ASC. Questo assicura che i mesi e i giorni di quel mese siano ordinati in modo crescente.

Vediamo il risultato dell'esecuzione di questa query:

idlocationcountorder_date
10Washington352021-01-07
3Chicago42021-03-18
7Memphis72021-05-04
1New York132021-05-21
5New York202020-01-27
8Cleveland182020-07-06
2Boston212020-11-12
6Boston332019-04-03
9Philadelphia62019-04-22
4Toronto102019-12-13

I risultati appaiono esattamente come li vogliamo! Gli ultimi anni appaiono per primi e ogni serie di risultati per anno è ordinata in base ai mesi e ai giorni di quell'anno.

SQL ORDER BY Valori specifici

Questo conclude la nostra analisi degli ordinamenti personalizzati. Abbiamo aumentato la complessità di ogni ordinamento con ogni esempio. A questo punto dovreste essere in grado di applicare i principi di questo articolo a un problema che potreste trovarvi ad affrontare. Se volete vedere altri esempi, consultate questo post su come ordinare i record con la clausola ORDER BY. Si tratta di un argomento SQL piuttosto avanzato. Per vedere altri problemi avanzati di SQL, consultate questo percorso di apprendimento di Advanced SQL. LearnSQL.it.