Curso
Crear informes a partir de un conjunto de datos es una habilidad esencial si trabajas con datos. Al fin y al cabo, quieres responder a preguntas clave del negocio con los datos que tienes a mano. Muchas veces, estas respuestas se presentan como gráficos, pero otras, también se necesitan informes en forma de tablas. En ambos casos, puede que necesites resumir los datos con cálculos sencillos. En SQL, puedes resumir/agrupar los datos con funciones de agregación. Con estas funciones podrás responder preguntas como:
- ¿Cuál es el valor máximo de
some_column_from_the_table? o - ¿Cuáles son los valores mínimos de
some_column_from_the_tablecon respecto aanother_column_from_the_table?
y muchas más.
Vamos a empezar a hacer algo de agregación de datos.
Nota: Para seguir este tutorial, necesitas saber escribir consultas básicas en PostgreSQL (que es el SGBD que vas a usar). Este tutorial puede servirte para repasar.
Configuración de la base de datos
Primero, vamos a crear una base de datos en PostgreSQL y a restaurar esta copia de seguridad, que contiene la tabla que vas a usar en este tutorial. Si quieres aprender a restaurar una copia de seguridad en PostgreSQL, puedes seguir la primera sección de este tutorial.
Si has podido restaurar la copia, deberías ver una tabla llamada international_debt en la base de datos (si no tienes una base de datos creada, tendrás que crearla primero). Echemos un vistazo rápido a las primeras filas de la tabla (una consulta select sencilla te servirá):

La tabla contiene información sobre las estadísticas de deuda de distintos países del mundo para el año en curso y en diferentes categorías (consulta las columnas indicator_name e indicator_code). La columna debt muestra el importe de la deuda (en USD) que tiene un país en una categoría específica. Es un conjunto de datos del ámbito de la economía y se usa a menudo para analizar la situación económica de diferentes países. Los datos proceden del Banco Mundial.
Ahora que has configurado la base de datos correctamente, vamos a ejecutar algunas consultas sencillas para conocer mejor los datos. Abre la herramienta pgAdmin y empezamos.
La información básica importa
En la figura anterior puedes ver que hay muchas entradas duplicadas para un mismo país pero en categorías distintas. Una pregunta que surge de inmediato es:
¿Qué países distintos aparecen registrados en la tabla?
Si ejecutas una consulta select con la columna country_name, no obtendrás la respuesta correcta porque el resultado contendrá duplicados. Usemos la palabra clave DISTINCT para solucionarlo.
select distinct country_name from international_debt;
Y esto debería devolver algo así:

Ahora ya tienes una buena respuesta a la pregunta anterior. Una última antes de pasar a las funciones de agregación:
¿Cuántos tipos distintos de indicadores de deuda hay en la tabla?
La consulta para responderla debería ser similar a la anterior. Solo cambia el nombre de la columna. ¿Lo dejamos como ejercicio? El resultado será parecido al siguiente:

Funciones de agregación
Empecemos ejecutando una consulta con una función de agregación y sigamos a partir de ahí. Por el camino, verás la sintaxis y los constructos que necesitas cuando apliques funciones de agregación en SQL.
select sum(debt) from international_debt;
Y el resultado:

Con la función de agregación SUM() puedes calcular la suma aritmética de una columna (que contenga valores numéricos). Con la consulta anterior, obtienes el total de deuda pendiente de los países que aparecen en la tabla.
Ten en cuenta que SUM() no tiene en cuenta los valores NULL al calcular la suma. Ahora, vamos a responder a la pregunta:
¿Cuál es el importe máximo de deuda?
Aquí entra en juego la función de agregación MAX():
select max(debt) from international_debt;
Y la respuesta es:

Al igual que SUM(), MAX() tampoco considera las entradas NULL en sus cálculos. Existe una función similar, MIN(). ¿Me cuentas el valor mínimo de la columna debt en la sección de Comentarios? Ahora es buen momento para comprobar si hay alguna entrada no válida en la columna debt y asegurarnos de que los resultados son correctos hasta ahora.
Fíjate en que aquí usamos estas funciones en minúsculas, como se muestra arriba.
Cuando ejecutes esta consulta: select * from international_debt where debt is null;, deberías obtener un resultado vacío. Ahora vamos a averiguar el número total de países distintos presentes en la tabla.
select count(distinct(country_name)) from international_debt;
Verás que hay un total de 124 países distintos en la tabla. Fíjate bien en la sucesión de funciones que aplicaste en la consulta anterior. Sí, aquí se permite encadenar más de una función de agregación de forma lógica.
Ahora, supongamos que quieres ver el valor medio de la columna debt. La función es AVG():
select avg(debt) from international_debt;
Verás que el valor es 1306633214.966397971 (USD). Es buena idea presentar estos resultados con nombres de columna adecuados. Como ves arriba, PostgreSQL cambia el nombre de la columna por el de la función de agregación cuando devuelve el resultado. Así que conviene asignar un alias claro a estas columnas. Puedes hacerlo así:
select avg(debt) as Average_Debt_By_A_Country from international_debt;
El resultado es mucho más fácil de interpretar:

Ahora vamos a subir un poco la complejidad. Para poder responder a preguntas como ¿Cuáles son los valores mínimos de some_column_from_the_table con respecto a another_column_from_the_table?, necesitas combinar una función de agregación con la cláusula GROUP BY. Veamos cómo.
Funciones de agregación + GROUP BY + más
Imagina que quieres generar un informe donde se muestre el country_name y la suma de sus deudas. Por ejemplo:

Informes como este se usan muy a menudo en el mundo real. ¿Qué consulta necesitas para obtenerlo? Tendrás que usar la función SUM() sobre debt. Y también tendrás que mostrar el country_name junto con la suma de deudas. Ejecuta esta consulta:
select country_name, sum(debt) from international_debt;
¿No te devuelve el siguiente error?
ERROR: column "international_debt.country_name" must appear in the GROUP BY clause or be used in an aggregate function
Vamos a entender qué significa. Cuando usas una función de agregación (como SUM()) junto a una columna no agregada como country_name, debes pasar esa columna no agregada a una cláusula GROUP BY. Así que la consulta correcta será:
select country_name, sum(debt) as total_debt from international_debt group by country_name;
Y el resultado es el esperado:

Nota el uso de alias en la consulta.
Ahora, supón que necesitas ordenar este informe por total_debt de mayor a menor. ¿Recuerdas la cláusula ORDER BY? Sí, también puedes combinar funciones de agregación con ORDER BY:
select country_name, sum(debt) as total_debt from international_debt
group by country_name order by total_debt desc;
El resultado ahora debería estar ordenado de forma descendente:

Nota la columna que usaste en la cláusula ORDER BY.
Otra pregunta importante:
¿Cuál es el importe de deuda más alto por categorías (ordenado de mayor a menor)?
Aquí tendrás que usar la función MAX(). A estas alturas, escribir la consulta no debería costarte:
select indicator_code, max(debt) as maximum_debt from international_debt
group by indicator_code order by maximum_debt desc;
Y obtienes un informe limpio:

También puedes limitar el número de filas en informes como este. Por ejemplo, si solo quieres incluir las cinco primeras entradas, usa la cláusula LIMIT.
select indicator_code, max(debt) as maximum_debt from international_debt
group by indicator_code order by maximum_debt desc
limit 5;
Hora del informe final de este tutorial. Necesitas incluir los nombres de los países en el informe anterior. ¿Cómo lo harías? Con la siguiente consulta:
select country_name, indicator_code, max(debt) as maximum_debt from international_debt
group by country_name, indicator_code order by maximum_debt desc;
Otro buen informe:

En la consulta anterior, añadiste la columna country_name tras la cláusula SELECT y también la incluiste en GROUP BY. Puedes extender este formato con tantas columnas como necesites.
El orden de GROUP BY, ORDER BY y LIMIT es muy importante al generar informes como este. Si cambias el orden por error, te encontrarás con errores. Compruébalo:
select country_name, sum(debt) as total_debt from international_debt
order by total_debt desc group by country_name;
Y obtienes:
ERROR: syntax error at or near "group"
LINE 1: ... from international_debt order by total_debt desc group by c...
En la consulta anterior, colocaste la cláusula ORDER BY antes de GROUP BY, lo cual no está permitido. De hecho, tampoco aplica cuando no usas funciones de agregación. El orden correcto es: GROUP BY -> ORDER BY -> LIMIT. No lo olvides.
Próximos pasos
¡Enhorabuena! Has llegado al final del tutorial. Aquí has visto las distintas funciones de agregación en PostgreSQL y cómo usarlas para generar informes útiles. Son habilidades clave para cualquier científico de datos. Para llevar tus habilidades en SQL al siguiente nivel de forma sistemática, puedes hacer estos cursos de DataCamp:
