SQL
Funzioni (aggregato)
Ricerca…
Sintassi
- Funzione (espressione [ DISTINCT ]) -DISTINCT è un parametro facoltativo
- AVG ([ALL | DISTINCT] espressione)
- COUNT ({[ALL | DISTINCT] espressione] | *})
- RAGGRUPPAMENTO (<espressione_colonna>)
- MAX (espressione [ALL | DISTINCT])
- MIN (espressione [ALL | DISTINCT])
- SUM (espressione [ALL | DISTINCT])
- VAR (espressione [ALL | DISTINCT])
OVER ([partition_by_clause] order_by_clause) - VARP ([ALL | DISTINCT] espressione)
OVER ([partition_by_clause] order_by_clause - STDEV ([ALL | DISTINCT] espressione)
OVER ([partition_by_clause] order_by_clause) - STDEVP ([ALL | DISTINCT] espressione)
OVER ([partition_by_clause] order_by_clause)
Osservazioni
Nella gestione del database una funzione aggregata è una funzione in cui i valori di più righe sono raggruppati come input su determinati criteri per formare un singolo valore di significato o misura più significativo come un set, una borsa o un elenco.
MIN returns the smallest value in a given column
MAX returns the largest value in a given column
SUM returns the sum of the numeric values in a given column
AVG returns the average value of a given column
COUNT returns the total number of values in a given column
COUNT(*) returns the number of rows in a table
GROUPING Is a column or an expression that contains a column in a GROUP BY clause.
STDEV returns the statistical standard deviation of all values in the specified expression.
STDEVP returns the statistical standard deviation for the population for all values in the specified expression.
VAR returns the statistical variance of all values in the specified expression. may be followed by the OVER clause.
VARP returns the statistical variance for the population for all values in the specified expression.
Le funzioni aggregate vengono utilizzate per calcolare una "colonna restituita di dati numerici"
SELECT
. In pratica riassumono i risultati di una particolare colonna di dati selezionati. - SQLCourse2.com
Tutte le funzioni aggregate ignorano i valori NULL.
SOMMA
Sum
funzione sommare il valore di tutti i righe nel gruppo. Se la clausola group by viene omessa, somma tutte le righe.
select sum(salary) TotalSalary
from employees;
TotalSalary |
---|
2500 |
select DepartmentId, sum(salary) TotalSalary
from employees
group by DepartmentId;
DepartmentID | TotalSalary |
---|---|
1 | 2000 |
2 | 500 |
Aggregazione condizionale
Tabella dei pagamenti
Cliente | Modalità di pagamento | Quantità |
---|---|---|
Peter | Credito | 100 |
Peter | Credito | 300 |
John | Credito | 1000 |
John | Addebito | 500 |
select customer,
sum(case when payment_type = 'credit' then amount else 0 end) as credit,
sum(case when payment_type = 'debit' then amount else 0 end) as debit
from payments
group by customer
Risultato:
Cliente | Credito | Addebito |
---|---|---|
Peter | 400 | 0 |
John | 1000 | 500 |
select customer,
sum(case when payment_type = 'credit' then 1 else 0 end) as credit_transaction_count,
sum(case when payment_type = 'debit' then 1 else 0 end) as debit_transaction_count
from payments
group by customer
Risultato:
Cliente | credit_transaction_count | debit_transaction_count |
---|---|---|
Peter | 2 | 0 |
John | 1 | 1 |
AVG ()
La funzione di aggregazione AVG () restituisce la media di una determinata espressione, in genere valori numerici in una colonna. Supponiamo di avere una tabella contenente il calcolo annuale della popolazione nelle città di tutto il mondo. I record di New York City sono simili a quelli seguenti:
TABELLA ESEMPIO
nome della città | popolazione | anno |
---|---|---|
New York City | 8.550.405 | 2015 |
New York City | ... | ... |
New York City | 8.000.906 | 2005 |
Per selezionare la popolazione media della città di New York, Stati Uniti, da una tabella contenente nomi di città, misure di popolazione e anni di misurazione per gli ultimi dieci anni:
QUERY
select city_name, AVG(population) avg_population
from city_population
where city_name = 'NEW YORK CITY';
Si noti come l'anno di misura è assente dalla query poiché la popolazione viene mediata nel tempo.
RISULTATI
nome della città | avg_population |
---|---|
New York City | 8.250.754 |
Nota: la funzione AVG () convertirà i valori in tipi numerici. Questo è particolarmente importante da ricordare quando si lavora con le date.
Elenco di concatenazione
Credito parziale a questa risposta SO.
List Concatenazione aggrega una colonna o un'espressione combinando i valori in una singola stringa per ciascun gruppo. Una stringa per delimitare ogni valore (vuoto o una virgola quando omesso) e l'ordine dei valori nel risultato può essere specificato. Sebbene non faccia parte dello standard SQL, tutti i principali fornitori di database relazionali lo supportano a modo loro.
MySQL
SELECT ColumnA
, GROUP_CONCAT(ColumnB ORDER BY ColumnB SEPARATOR ',') AS ColumnBs
FROM TableName
GROUP BY ColumnA
ORDER BY ColumnA;
Oracle e DB2
SELECT ColumnA
, LISTAGG(ColumnB, ',') WITHIN GROUP (ORDER BY ColumnB) AS ColumnBs
FROM TableName
GROUP BY ColumnA
ORDER BY ColumnA;
PostgreSQL
SELECT ColumnA
, STRING_AGG(ColumnB, ',' ORDER BY ColumnB) AS ColumnBs
FROM TableName
GROUP BY ColumnA
ORDER BY ColumnA;
server SQL
SQL Server 2016 e versioni precedenti
(CTE inclusa per incoraggiare il principio DRY )
WITH CTE_TableName AS (
SELECT ColumnA, ColumnB
FROM TableName)
SELECT t0.ColumnA
, STUFF((
SELECT ',' + t1.ColumnB
FROM CTE_TableName t1
WHERE t1.ColumnA = t0.ColumnA
ORDER BY t1.ColumnB
FOR XML PATH('')), 1, 1, '') AS ColumnBs
FROM CTE_TableName t0
GROUP BY t0.ColumnA
ORDER BY ColumnA;
SQL Server 2017 e SQL Azure
SELECT ColumnA
, STRING_AGG(ColumnB, ',') WITHIN GROUP (ORDER BY ColumnB) AS ColumnBs
FROM TableName
GROUP BY ColumnA
ORDER BY ColumnA;
SQLite
senza ordinare:
SELECT ColumnA
, GROUP_CONCAT(ColumnB, ',') AS ColumnBs
FROM TableName
GROUP BY ColumnA
ORDER BY ColumnA;
l'ordine richiede una subquery o CTE:
WITH CTE_TableName AS (
SELECT ColumnA, ColumnB
FROM TableName
ORDER BY ColumnA, ColumnB)
SELECT ColumnA
, GROUP_CONCAT(ColumnB, ',') AS ColumnBs
FROM CTE_TableName
GROUP BY ColumnA
ORDER BY ColumnA;
Contare
Puoi contare il numero di righe:
SELECT count(*) TotalRows
FROM employees;
TotalRows |
---|
4 |
O contare i dipendenti per dipartimento:
SELECT DepartmentId, count(*) NumEmployees
FROM employees
GROUP BY DepartmentId;
DepartmentID | NumEmployees |
---|---|
1 | 3 |
2 | 1 |
Puoi contare su una colonna / espressione con l'effetto che non conteggia i valori NULL
:
SELECT count(ManagerId) mgr
FROM EMPLOYEES;
mgr |
---|
3 |
(C'è una colonna ID gestore valori null)
Puoi anche utilizzare DISTINCT all'interno di un'altra funzione come COUNT per trovare solo i membri DISTINCT del set su cui eseguire l'operazione.
Per esempio:
SELECT COUNT(ContinentCode) AllCount
, COUNT(DISTINCT ContinentCode) SingleCount
FROM Countries;
Restituirà valori diversi. Il SingleCount conterà solo una volta i singoli Continenti, mentre l' AllCount includerà duplicati.
ContinentCode |
---|
OC |
Unione Europea |
COME |
N / A |
N / A |
AF |
AF |
AllCount: 7 SingleCount: 5
Max
Trova il valore massimo della colonna:
select max(age) from employee;
L'esempio sopra restituirà il valore più grande per l' age
della colonna della tabella dei employee
.
Sintassi:
SELECT MAX(column_name) FROM table_name;
min
Trova il valore più basso della colonna:
select min(age) from employee;
L'esempio sopra restituirà il valore più piccolo per l' age
della colonna della tabella dei employee
.
Sintassi:
SELECT MIN(column_name) FROM table_name;