Saltar a contenido

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 y columna2, 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.

PostgreSQL GROUP BY

Ejemplos de la cláusula GROUP BY de PostgreSQL

Echemos un vistazo a la tabla payment de la base de datos de ejemplo.

payment

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.