Vediamo come fare per inserire una colonna contatore all’interno di una query Oracle
Sono due i metodi che ci consentono di inserire un contatore in una query, e sono il count(*) e il row_number(). Vediamoli entrambi.
Il COUNT(*)
Il count è semplicemente un contatore di righe aggregate, esso visualizza un numero in base a come si costruisce la query. Se per esempio scriviamo
SELECT COUNT(*) FROM PERSONE
avremo come risultato una sola riga con una sola colonna contenente il numero di righe presenti nella tabella PERSONE, considerando anche le righe duplicate e le righe null.
Possiamo usarla per contare i raggruppamenti, per esempio per contare il numero di maschi e il numero di femmine all’interno della tabella PERSONE, in questo modo
SELECT SESSO, COUNT(*) FROM PERSONE GROUP BY SESSO
Questa query ci mostrerà i sessi disponibili in tabella, e il conteggio delle persone per ogni sesso.
Questo è il count. Semplice e veloce.
COUNT(campo)
Questo utilizzo del count ci permette di ottenere il conteggio di tutti i valori non nulli riguardo il campo indicato, inclusi i duplicati.
Su una tabella così costruita
RIGA | NOME | COGNOME | ANNI |
1 | Francesco | Martinelli | 18 |
2 | Francesco | Power | 19 |
3 | Rossi | 18 | |
4 | Vincenzo | Bianchi | 23 |
Avendo volutamente lasciato vuoto il campo NOME della riga 3, la seguente query
SELECT COUNT(NOME) FROM PERSONE
restituirà il valore 3, in quanto solo in una riga il campo NOME è vuota
COUNT(DISTINCT(campo))
Questo utilizzo del count ci permette di ottenere il conteggio di tutti i valori non nulli riguardo il campo indicato, escludendo i duplicati.
Utilizzando la stessa tabella di prima
RIGA | NOME | COGNOME | ANNI |
1 | Francesco | Martinelli | 18 |
2 | Francesco | Power | 19 |
3 | Rossi | 18 | |
4 | Vincenzo | Bianchi | 23 |
la seguente query
SELECT COUNT(DISTINCT(NOME)) FROM PERSONE
restituirà il valore 2, in quanto nella colonna NOME un campo è vuoto, mentre nelle righe 1 e 2 avendo lo stesso valore ed avendo usato la funzione DISTINCT che elimina i duplicati, andrà a conteggiare solo 2 valori.
Il ROW_NUMBER()
Questa funzione è molto più evoluta del COUNT(*). Essa ci permette di avere un contatore che può avere un reset in base ad un set di colonne, e può eseguire un conteggio che può essere di natura differente dall’ORDER BY finale.
La sintassi da utilizzare è
ROW_NUMBER() OVER (PARTITION BY [Colonne di reset] ORDER BY [Colonne d'ordine])
Le [Colonne di reset] sono il set di colonne che serve per far ripartire il contatore da 1. Se ad esempio si imposta una coppia di colonne, appena la coppia varia alla riga successiva il contatore si resetta ritornando ad 1. Nel caso non vogliamo avere un reset, dobbiamo sostiture [Colonne di reset] con 1.
Le [Colonne d’ordine] sono il set di colonne che serve su cui basarsi con il conteggio. Se per esempio vogliamo una query ordinata per COGNOMI, ma vogliamo eseguire un conteggio per NOMI, allora l’ORDER BY finale della query deve contenere COGNOMI, mentre l’ORDER BY del nostro ROW_NUMBER deve contenere i NOMI.
Non va necessariamente utilizzata in query raggruppate o ordinate.