La cláusula GROUP BY
divide las filas devueltas por la sentencia SELECT
en grupos.
Para cada grupo, puede aplicar una función agregada como SUM()
para calcular la suma de elementos o COUNT()
para obtener el número de elementos de los grupos.
A continuación se ilustra la sintaxis básica de la cláusula GROUP BY
:
SELECT
column_1,
column_2,
...,
aggregate_function(column_3)
FROM
table_name
GROUP BY
column_1,
column_2,
...;
En esta sintaxis:
- Primero, seleccione las columnas que desea agrupar, como
columna1
ycolumna2
, y la columna a la que desea aplicar una función de agregado (columna3
). - En segundo lugar, enumere las columnas que desea agrupar en la cláusula
GROUP BY
.
La cláusula GROUP BY
divide las filas por los valores de las columnas especificadas en la cláusula GROUP BY
y calcula un valor para cada grupo.
Es posible utilizar otras cláusulas de la sentencia SELECT
con la cláusula GROUP BY
.
PostgreSQL evalúa la cláusula GROUP BY
después de las cláusulas FROM
y WHERE
y antes de las cláusulas HAVING
SELECT
, DISTINCT
, ORDER BY
y LIMIT
.
Ejemplos de la cláusula GROUP BY de PostgreSQL¶
Echemos un vistazo a la tabla payment
de la base de datos de ejemplo.
Uso de PostgreSQL GROUP BY sin una función de agregado ejemplo¶
El siguiente ejemplo utiliza la cláusula GROUP BY
para recuperar el customer_id
de la tabla de pagos:
SELECT
customer_id
FROM
payment
GROUP BY
customer_id
ORDER BY
customer_id;
Salida:
customer_id
-------------
1
2
3
4
5
6
7
8
...
Cada cliente tiene uno o más pagos. La cláusula GROUP BY
elimina los valores duplicados de la columna customer_id y devuelve identificadores de cliente distintos. En este ejemplo, la cláusula GROUP BY
funciona como el operador DISTINCT
.
Ejemplo de uso de PostgreSQL GROUP BY con la función SUM()¶
La cláusula GROUP BY
es útil cuando se utiliza junto con una función aggregate function.
La siguiente consulta utiliza la cláusula GROUP BY
para recuperar el pago total pagado por cada cliente:
SELECT
customer_id,
SUM (amount)
FROM
payment
GROUP BY
customer_id
ORDER BY
customer_id;
Salida:
customer_id | sum
-------------+--------
1 | 114.70
2 | 123.74
3 | 130.76
4 | 81.78
5 | 134.65
6 | 84.75
7 | 130.72
...
En este ejemplo, la cláusula GROUP BY
agrupa los pagos por el id de cliente. Para cada grupo, calcula el pago total.
La siguiente sentencia utiliza la cláusula ORDER BY
con la cláusula GROUP BY
para ordenar los grupos por el total de pagos:
SELECT
customer_id,
SUM (amount)
FROM
payment
GROUP BY
customer_id
ORDER BY
SUM (amount) DESC;
Salida:
customer_id | sum
-------------+--------
148 | 211.55
526 | 208.58
178 | 194.61
137 | 191.62
144 | 189.60
Uso de la cláusula GROUP BY de PostgreSQL con la cláusula JOIN¶
La siguiente sentencia utiliza la cláusula GROUP BY
para recuperar el pago total de cada cliente y mostrar el nombre del cliente y el importe:
SELECT
first_name || ' ' || last_name full_name,
SUM (amount) amount
FROM
payment
INNER JOIN customer USING (customer_id)
GROUP BY
full_name
ORDER BY
amount DESC;Code language: JavaScript (javascript)
Salida:
full_name | amount
-----------------------+--------
Eleanor Hunt | 211.55
Karl Seal | 208.58
Marion Snyder | 194.61
Rhonda Kennedy | 191.62
Clara Shaw | 189.60
...
En este ejemplo, unimos la tabla payment
con la tabla customer
utilizando un inner join para obtener los nombres de los clientes y agruparlos por sus nombres.
Ejemplo de uso de la función PostgreSQL GROUP BY with COUNT()¶
El siguiente ejemplo utiliza la cláusula GROUP BY
con la función COUNT()
para contar el número de pagos procesados por cada empleado:
SELECT
staff_id,
COUNT (payment_id)
FROM
payment
GROUP BY
staff_id;
Salida:
staff_id | count
----------+-------
1 | 7292
2 | 7304
(2 rows)
En este ejemplo, la cláusula GROUP BY
divide las filas de la tabla payment
en grupos y los agrupa por el valor de la columna staff_id
. Para cada grupo, cuenta el número de filas utilizando la función COUNT()
.
Usando PostgreSQL GROUP BY con múltiples columnas¶
El siguiente ejemplo utiliza una cláusula GROUP BY
para agrupar filas por valores en dos columnas:
SELECT
customer_id,
staff_id,
SUM(amount)
FROM
payment
GROUP BY
staff_id,
customer_id
ORDER BY
customer_id;
Salida:
customer_id | staff_id | sum
-------------+----------+--------
1 | 2 | 53.85
1 | 1 | 60.85
2 | 2 | 67.88
2 | 1 | 55.86
3 | 1 | 59.88
...
En este ejemplo, la cláusula GROUP BY
divide las filas de la tabla payment
por los valores de las columnas customer_id
y staff_id
. Para cada grupo de (customer_id, staff_id)
, la función SUM()
calcula el importe total.
Uso de la cláusula GROUP BY de PostgreSQL con una columna de fecha¶
El siguiente ejemplo utiliza la cláusula GROUP BY
para agrupar pagos por fecha de pago:
SELECT
DATE(payment_date) payment_date,
SUM(amount) sum
FROM
payment
GROUP BY
DATE(payment_date)
ORDER BY
payment_date DESC;
Salida:
payment_date | sum
--------------+---------
2007-05-14 | 514.18
2007-04-30 | 5723.89
2007-04-29 | 2717.60
2007-04-28 | 2622.73
...
Dado que payment_date
es una columna timestamp, la convertimos en una fecha utilizando la función DATE() y agrupamos los pagos por la fecha.
Resumen¶
- Utilice la cláusula
GROUP BY
de PostgreSQL para dividir las filas en grupos y aplicar una función agregada a cada grupo.