Volver a la lista de artículos Artículos
Lectura de 21 minutos

19 Ejercicios de Funciones Agregadas

Resuelva estos 19 ejercicios de funciones agregadas de SQL y perfeccione sus conocimientos de SQL. Practique el uso de funciones agregadas con GROUP BY, HAVING, subconsultas y mucho más. Incluye una solución y una explicación detallada para cada ejercicio.

Las funciones agregadas son una parte importante de SQL. Te permiten calcular diferentes estadísticas y generar informes que no habrías podido hacer con operaciones de una sola fila como el filtrado. Es importante practicar las funciones agregadas a menudo, ya que son una parte crucial de tus habilidades SQL. Empecemos

Este artículo incluye 19 nuevos ejercicios de funciones agregadas utilizando nuestra base de datos de bibliotecas. Cubriremos la agrupación con GROUP BY, el filtrado de datos con HAVING, el uso de funciones de agregación dentro de subconsultas y la agregación multinivel. También refrescaremos sus conocimientos sobre el trabajo con JOINs y NULLs y sobre el ordenamiento de datos por varias estadísticas.

Una vez que esté listo para aplicar estos conceptos en escenarios reales, consulte nuestro curso de Informes SQL Básicos. Cubre todos los conceptos de funciones agregadas que practicarás en este artículo, además de otros temas importantes como el uso de CASE WHEN.

También te recomendamos que pruebes nuestros retos mensuales en Práctica mensual de SQL Track. Se trata de una colección de ejercicios prácticos, que se publican todos los meses, diseñados específicamente para mantener sus conocimientos de SQL actualizados.

¿Qué son las funciones agregadas?

Lasfunciones agregadas realizan cálculos sobre un conjunto de valores y devuelven un único valor como resultado. Funciones agregadas comunes son:

  • SUM() - Calcula la suma de todos los valores de cada grupo.
  • AVG() - Calcula el valor medio de todos los valores de cada grupo.
  • COUNT() - Devuelve el número de valores de cada grupo.
  • MIN() y MAX() - Devuelven los valores más pequeño y más grande (respectivamente) de cada grupo.

Estas funciones son especialmente útiles cuando se crean informes en los que es necesario calcular varias métricas.

¿Necesita una explicación más detallada? Consulte nuestra hoja de trucos sobre funciones agregadas SQL, que cubre todas las funciones agregadas, sus casos de uso y sus interacciones con GROUP BY.

¿Por qué Practicar las Agregaciones SQL?

La práctica regular le ayuda a mantener sus habilidades afiladas, permitiéndole analizar y manipular datos más rápida y eficientemente. A medida que practique más, podrá resolver problemas más complejos y optimizar mejor sus consultas.

Practicar SQL es vital si quieres trabajar como analista de datos, desarrollador de bases de datos o en cualquier otro puesto en el que se manejen muchos datos. Consulte nuestro artículo sobre ejercicios GROUP BY para perfeccionar sus habilidades de creación de informes.

El conjunto de datos

Echemos un vistazo al conjunto de datos con el que trabajaremos para estas preguntas de práctica.

El conjunto de datos consta de cinco tablas: book, author, book_author, patron, y book_loan. Este es el esquema:

Ejercicios de función agregada

La información sobre los libros se almacena en la tabla book. Tiene las siguientes columnas:

  • book_id - Un ID único para cada libro y la clave principal de la tabla.
  • title - El título del libro.
  • publication_year - El año de publicación del libro. Puede ser NULL si se desconoce.
  • genre - El género del libro, por ejemplo, "Fantasía" o "Misterio".
  • pages - El número de páginas del libro.

He aquí una instantánea de los datos de la tabla:

book_idtitlepublication_yeargenrepages
119841949Political Fiction328
2Animal Farm1945Political Fiction112
3The Hobbit1937Fantasy310
4The Fellowship of the Ring1954Fantasy423

La información sobre los autores se almacena en la tabla author. Tiene las siguientes columnas:

  • author_id - Un ID único para cada autor y la clave primaria de la tabla.
  • author_name - Nombre completo o seudónimo del autor.
  • country - País del autor.

Estos son algunos de los datos de la tabla:

author_idauthor_namecountry
1George OrwellUnited Kingdom
2J.R.R. TolkienUnited Kingdom
3Isaac AsimovUnited States
4Agatha ChristieUnited Kingdom

En la tabla se almacenan datos sobre las personas que toman libros prestados de la biblioteca patron. Tiene las siguientes columnas:

  • patron_id - Un identificador único para cada usuario y la clave principal de la tabla.
  • patron_name - El nombre completo del usuario.
  • registration_date - La fecha en la que el usuario se registró en el sistema de bibliotecas.

Estos son algunos de los datos de la tabla:

patron_idpatron_nameregistration_date
1Alice Johnson2024-01-15
2Bob Smith2024-03-22
3Charlie Brown2024-05-10
4David Wilson2024-06-01

La relación de muchos a muchos entre los autores y los libros que escribieron se almacena en la tabla book_author tabla. Tiene las siguientes columnas

  • book_author_id - Un ID único para cada par libro-autor y la clave primaria de la tabla.
  • author_id - El ID del autor.
  • book_id - El ID del libro que escribió el autor.

Estos son algunos de los datos de la tabla:

book_author_idauthor_idbook_id
111
212
323
424

La relación múltiple entre los usuarios y los libros que han tomado prestados se almacena en la tabla book_loan tabla. Tiene las siguientes columnas:

  • loan_id - Un ID único para cada préstamo y la clave primaria de la tabla.
  • book_id - El ID del libro prestado.
  • patron_id - El ID del usuario que tomó prestado el libro.
  • loan_date - La fecha en que se emitió el préstamo del libro.
  • due_date - La fecha en la que debe devolverse el libro.
  • return_date - La fecha real de devolución del libro.

Estos son algunos de los datos de la tabla:

loan_idbook_idpatron_idloan_datedue_datereturn_date
1112024-01-202024-02-202024-02-15
2812024-02-012024-03-012024-02-28
3322024-02-102024-03-102024-03-05
4432024-03-152024-04-102024-04-15

Vuelve a esta sección si olvidas los nombres de las tablas o columnas al resolver los ejercicios. Si necesita consejos de sintaxis, tenga a mano nuestra hoja de trucos SQL para análisis de datos. Cubre todas las herramientas que pueden ayudarte a resolver estos ejercicios. Incluso puedes descargarla en formato PDF e imprimirla, ¡para que te ayude con tus futuros ejercicios!

Practica estas Funciones Agregadas SQL

Resuelve los ejercicios por tu cuenta, luego revisa las soluciones debajo de cada ejercicio. También hay explicaciones adicionales para cada solución si te quedas atascado.

Ejercicio 1: Libros en el Sistema

Ejercicio: Contar el número de libros registrados en la base de datos.

Solución:

SELECT COUNT(book_id)
FROM book;

Explicación: Utilizamos la función COUNT() para obtener el número de filas de la book tabla.

Observe dos cosas. En primer lugar, la consulta no tiene la cláusula WHERE, por lo que no se filtra ninguna fila; se cuentan todas las filas de la tabla. En segundo lugar, la consulta no tiene la cláusula GROUP BY. Cuando se utiliza una función agregada sin GROUP BY, todas las filas se colocan en un grupo y la función se aplica a todas las filas de este grupo. Por lo tanto, nuestra consulta cuenta todas las filas de la tabla book tabla.

Ejercicio 2: Libros no devueltos

Ejercicio: Contar cuántos libros aún no han sido devueltos (es decir, libros que no tienen fecha de devolución).

Solución:

SELECT COUNT(loan_id)
FROM book_loan
WHERE return_date IS NULL;

Explicación: Los libros que no han sido devueltos no tendrán un return_date en la book_loan su return_date es NULL. Utilizamos esta condición en la cláusula WHERE para seleccionar sólo los libros que aún no han sido devueltos.

Utilizamos la función COUNT() para contar el número de filas del conjunto de datos resultante. Tenga en cuenta que el argumento utilizado con la función COUNT() es importante. Aquí ponemos loan_id como argumento, lo que indica a la base de datos que cuente todos los valores de las columnas loan_id.

Alternativamente, podríamos haber utilizado COUNT(*) y simplemente contar todas las filas del conjunto de resultados, dando el mismo resultado. Sin embargo, COUNT(return_date) no sería apropiado: el resultado sería 0. Todos los return_dates en el resultado son NULL debido a la condición return_date IS NULL.

De nuevo, no hay GROUP BY en esta consulta, por lo que la función COUNT() contará todos los préstamos en los que la fecha de devolución esté vacía.

Ejercicio 3: Libros por género

Ejercicio: Para cada género, muestre el nombre del género y el número de libros de ese género.

Solución:

SELECT
  genre,
  COUNT(book_id)
FROM book
GROUP BY genre;

Explicación: Este es el ejercicio más básico de GROUP BY. De la tabla bookseleccionamos el género.

Para asegurarnos de que la función COUNT() devuelve un resultado distinto para cada género, dividimos el conjunto de datos en grupos utilizando GROUP BY género. Esto creará grupos basados en los valores de la columna genre; los libros con el mismo valor en género van al mismo grupo.

La función COUNT() trabajará en cada grupo por separado, contando el número de libros en cada grupo.

Si necesita que le refresquemos la memoria sobre cómo trabajar con GROUP BY y las funciones agregadas, consulte nuestra Visión general completa de las funciones GROUP BY y agregadas.

Ejercicio 4: Autores por país

Ejercicio: Para cada país, muestre su nombre y el número de autores asociados a él.

Solución:

SELECT
  country,
  COUNT(author_id)
FROM author
GROUP BY country;

Explicación: Este es otro ejercicio básico de GROUP BY. Seleccionamos los datos de la tabla autor y los agrupamos por los valores de la columna country. Luego aplicamos COUNT(author_id) a cada grupo para contar los autores procedentes de ese país.

Ejercicio 5: Rangos de Páginas por Género

Ejercicio: Para cada género, muestre cuatro columnas: el nombre del género, el número mínimo y máximo de páginas de los libros de ese género, y el difference entre el mayor y el menor número de páginas de cada libro.

Solución:

SELECT
  genre,
  MIN(pages),
  MAX(pages),
  MAX(pages) - MIN(pages) AS difference
FROM book
GROUP BY genre;

Explicación: Este es otro ejercicio básico de GROUP BY. Seleccionamos los datos de la tabla autor y los agrupamos por los valores de la columna país. Luego aplicamos COUNT(author_id) a cada grupo para contar los autores que provienen de ese país.

Ejercicio 5: Rangos de páginas por género

Ejercicio: Para cada género, muestre cuatro columnas: el nombre del género, el número mínimo y máximo de páginas de los libros de ese género, y la diferencia entre el mayor y el menor número de páginas de cada libro.

Solución:

Explicación: Para obtener las estadísticas de cada género, agrupa los datos de la book tabla por la columna genre.

Utiliza las funciones de agregación MIN(pages) y MAX(pages) para calcular el número mínimo y máximo de páginas. En la tercera columna, utiliza MIN(pages) - MAX(pages) para calcular la diferencia de cada grupo. Finalmente, renombre la última columna a difference utilizando AS.

Ejercicio 6: Géneros de Libros Grandes

Ejercicio: Para cada género, muestre el número medio de páginas de todos los libros de ese género. Sólo muestre los géneros en los que el libro medio tiene más de 250 páginas. Nombre la columna de páginas promedio avg_pages.

Solución:

SELECT
  genre,
  AVG(pages) AS avg_pages
FROM book
GROUP BY genre
HAVING AVG(pages) >= 250;

Explicación: Este ejercicio es similar al anterior: agrupamos los libros por género y calculamos el número medio de libros de cada género utilizando AVG(). Sin embargo, aquí hay un elemento nuevo: HAVING. HAVING se utiliza para filtrar grupos y encontrar grupos para los que una función agregada satisface una determinada condición. En nuestro caso, buscamos grupos (géneros) en los que el número medio de páginas sea superior o igual a 250.

Recuerde que HAVING funciona de forma diferente a WHERE. WHERE se utiliza para filtrar filas individuales antes de agrupar, mientras que HAVING se utiliza para filtrar filas después de agrupar. Puede leer sobre la diferencia entre HAVING y WHERE en nuestro artículo HAVING vs. WHERE en SQL: Lo que debes saber.

Ejercicio 7: Géneros Modernos

Ejercicio: Muestre el año medio de publicación para cada género de libros. Redondee el año a un número entero. Muestre sólo los géneros cuyo año medio de publicación sea posterior a 1940.

Solución:

SELECT
  genre,
  ROUND(AVG(publication_year))
FROM book
GROUP BY genre
HAVING ROUND(AVG(publication_year)) > 1940;

Explicación: Este ejercicio es similar al anterior: agrupamos los libros por genre y calculamos el año medio de publicación mediante AVG(publication_year). A continuación, filtramos por géneros con un año medio de agregación superior a 1940 utilizando HAVING.

Ejercicio 8: Libros con varios autores

Ejercicio: Para los libros que han sido escritos por más de un autor, muestre el título de cada libro y el número de autores.

Solución:

SELECT 
  title,
  COUNT(author_id)
FROM book b
JOIN book_author ba
  ON b.book_id = ba.book_id
GROUP BY b.book_id
HAVING COUNT(author_id) > 1;

Explicación: En primer lugar, tenemos que encontrar los autores de cada libro. Para ello, unimos las tablas book y book_author en su dirección común book_id. Esto combinará los datos de cada libro con los datos de sus autores: una fila por cada combinación libro-autor.

A continuación, agrupamos las filas por book_id: todas las filas relacionadas con el mismo libro se encuentran en el mismo grupo. Así, todos los autores de cada libro estarán en el mismo grupo. A continuación, aplicamos la función COUNT(author_id) para contar los autores de cada grupo.

Por último, filtramos los libros con un solo autor utilizando HAVING COUNT(author_id) > 1.

Ejercicio 9: Último préstamo de cada libro

Ejercicio: Para cada libro, muestre su title y la fecha más reciente en que fue prestado. Nombre la segunda columna last_loaned. Muestre NULL en la segunda columna para todos los libros que nunca han sido prestados.

Solución:

SELECT
  book.title,
  MAX(book_loan.loan_date) AS last_loaned
FROM book
LEFT JOIN book_loan 
  ON book.book_id = book_loan.book_id
GROUP BY 
  book.book_id,
  book.title;

Explicación: Utilice LEFT JOIN para unir las columnas book y book_loan para asegurarse de que los libros que nunca se han prestado también se incluyen en el conjunto de resultados. Agrupe los resultados por book_id y book_title.

Tenga en cuenta que no debe agrupar el resultado sólo por el título; si dos libros tienen el mismo título, se pondrían erróneamente en el mismo grupo. Agrupe por book_id (ya que identifica unívocamente cada libro) y title (porque SQL arroja un error si una columna no agregada en SELECT no se pone en GROUP BY). Puedes leer sobre ello en nuestro artículo 7 errores comunes de GROUP BY.

Para obtener la última loan_date, utilice MAX(loan_date). Las fechas posteriores se tratan como "mayores". Si no hay préstamos de libros para este libro, todas sus fechas de préstamo serán NULL y la función MAX() devolverá NULL para este libro.

Ejercicio 10: Préstamos de libros por mes

Ejercicio: Muestre cuántos préstamos de libros se emitieron cada mes de cada año. Muestre tres columnas:

  • La parte del año y del mes de loan_date como números en las dos primeras columnas. Nómbralas loan_year y loan_month
  • Una columna contando cuántos libros se prestaron ese mes.

Ordena el resultado por el año y luego por el mes, mostrando primero las fechas más antiguas.

Solución:

SELECT
  EXTRACT(YEAR FROM loan_date) AS loan_year,
  EXTRACT(MONTH FROM loan_date) AS loan_month,
  COUNT(loan_id)
FROM book_loan
GROUP BY 
  EXTRACT(MONTH FROM loan_date),
  EXTRACT(YEAR FROM loan_date)
ORDER BY 
  loan_year,
  loan_month;

Explicación: Utilizamos EXTRACT(YEAR FROM loan_date) y EXTRACT(MONTH FROM loan_date) para obtener las partes de año y mes de loan_date. Volvemos a utilizar EXTRACT() en GROUP BY para agrupar los préstamos de los mismos meses.

Utilizamos la función COUNT() para calcular el número de préstamos realizados en cada mes.

Por último, ordenamos los resultados por loan_year y loan_month. Observe que puede utilizar los alias de columna en la sentencia ORDER BY. En la sentencia GROUP BY, sin embargo, todavía tiene que utilizar las funciones; cuando se procesa esta cláusula, la función EXTRACT() (y por tanto las nuevas columnas) todavía no se han definido. Puedes leer más sobre este tema en nuestro artículo SQL Orden de Operaciones.

Ejercicio 11: Libros Populares

Ejercicio: Para cada libro, muestre su title, el número de veces que ha sido prestado y el número de usuarios diferentes que han tomado prestado el libro. Nombra las dos últimas columnas times_loaned y different_patrons.

Solución:

SELECT
  title,
  COUNT(loan_id) AS times_loaned,
  COUNT(DISTINCT patron_id) AS different_patrons
FROM book b
LEFT JOIN book_loan bl
  ON b.book_id = bl.book_id
GROUP BY
  b.title,
  b.book_id;

Explicación: Para encontrar los préstamos de cada libro, hay que unir las tablas book y book_loan. Utilice LEFT JOIN para asegurarse de que los libros que nunca se han prestado también aparecen en el resultado.

Queremos agrupar los préstamos de cada libro, así que tenemos que agrupar tanto por book_id como por el libro title (por la misma razón que discutimos en el Ejercicio 9).

Queremos contar el número de veces que el libro fue prestado y el número de usuarios diferentes que tomaron prestado el libro. Para ello, tenemos que utilizar la función COUNT() dos veces.

Primero, usamos COUNT(loan_id) para contar el número de préstamos del libro.

El segundo uso de COUNT() es más interesante: queremos contar los diferentes usuarios que han tomado prestado el libro. Si alguien tomó prestado el mismo libro varias veces, queremos contarlo sólo una vez. Para ello utilizamos COUNT(DISTINCT patron_id). El uso de DISTINCT garantizará que, incluso si un usuario toma prestado el mismo libro varias veces, su ID sólo se cuente una vez.

Puede obtener más información sobre este tema leyendo ¿Cuál es la diferencia entre COUNT(*), COUNT(1), COUNT(column) y COUNT(DISTINCT)?

Ejercicio 12: Libros Atrasados

Ejercicio: Para cada cliente, muestre su nombre y la cantidad de libros que tiene (tenían) atrasados (es decir, con fecha de devolución posterior a la fecha de vencimiento).

Solución:

SELECT
  patron_name,
  COUNT(book_id) AS overdue_books
FROM patron p
LEFT JOIN book_loan bl
  ON p.patron_id = bl.patron_id AND return_date > due_date
GROUP BY
  p.patron_id,
  patron_name;

Explicación: Unir patron y book_loan utilizando LEFT JOIN para asegurarse de que los usuarios que no tienen préstamos de libros vencidos también se incluyen en el resultado.

Para seleccionar sólo los préstamos cuya fecha de devolución sea posterior a la fecha de vencimiento, utilice una condición de unión combinada: ON p.patron_id = bl.patron_id AND return_date > due_date. La primera parte sólo unirá las filas que estén realmente relacionadas. La segunda parte se utiliza como un filtro adicional para unir sólo en lugares donde return_date > due_date.

Tenga en cuenta que esto es diferente de utilizar una cláusula WHERE más adelante en la consulta. La cláusula WHERE descartará todas las filas en las que loan_id IS NULL. Sin embargo, queremos mantener esas filas para incluir a los usuarios que no tienen libros atrasados.

Agrupamos las filas por patron_id y patron_name (por las mismas razones que en el Ejercicio 9). Por último, utilizamos COUNT(book_id) para contar los libros atrasados de cada usuario. COUNT() devolverá 0 para los usuarios que nunca han realizado préstamos y para los usuarios que siempre han devuelto sus libros a tiempo.

Ejercicio 13: Media de autores por género

Ejercicio: Para cada género, muestre su nombre y el número medio de autores que tienen los libros de ese género. Nombra la segunda columna average_authors_per_book

Solución:

WITH number_of_authors AS (
  SELECT
    book_id,
    COUNT(author_id) AS author_count
  FROM book_author
  GROUP BY book_id
)
SELECT
  genre,
  AVG(author_count) AS average_authors_per_book
FROM number_of_authors na
JOIN book b
  ON na.book_id = b.book_id
GROUP BY genre;

Explicación: Aquí usamos una construcción llamada expresión común de tabla (CTE). Puede obtener más información sobre las CTE en nuestra Guía de expresiones comunes de tabla.

En resumen, una CTE le permite crear un conjunto de resultados temporal con nombre que puede utilizar en la consulta. Puede crear una CTE utilizando esta sintaxis:

WITH <cte_name> AS (query)

Cualquier consulta dentro del paréntesis actuará como una tabla virtual llamada cte_name y será accesible para la consulta principal (la sentencia SELECT después del paréntesis de cierre de la CTE).

En la ETC, calculamos el número de autores de cada libro. Seleccionamos book_id y el recuento de autores. Se trata de una consulta similar a la del Ejercicio 8.

En la consulta externa, unimos nuestro CTE number_of_authors con la tabla book para mostrar el género de cada libro. Luego utilizamos AVG(author_count) y GROUP BY género para obtener el resultado final.

Si no desea utilizar una CTE, puede obtener el mismo resultado utilizando una subconsulta:

SELECT
  genre,
  AVG(author_count) AS average_authors_per_book
FROM (
  SELECT
    book_id,
    COUNT(author_id) AS author_count
  FROM book_author
  GROUP BY book_id) AS na
  JOIN book b
    ON na.book_id = b.book_id
  GROUP BY genre;

Ejercicio 14: Número de páginas leídas por los usuarios

Ejercicio: Para cada cliente, muestre su nombre y el número total de páginas que ha leído (es decir, el número de páginas de todos los libros que ha tomado prestados). Suponemos que han leído todos los libros. Incluya todos los libros, incluso los que aún no han devuelto.

Mostrar sólo los resultados de los usuarios que hayan leído más de 1.000 páginas.

Solución:

SELECT
  patron_name,
  SUM(pages) AS total_pages_read
FROM book b
JOIN book_loan bl
  ON b.book_id = bl.book_id
JOIN patron p
  ON p.patron_id = bl.patron_id
GROUP BY 
  p.patron_id,
  p.patron_name
HAVING SUM(pages) > 1000;

Explicación: Una tres tablas utilizando un JOIN regular : patron, book_loan, y book. Utilice SUM(pages) para sumar el número de páginas de todos los libros prestados por el usuario. Filtre con HAVING SUM(pages) > 1000 para mostrar sólo los usuarios que han leído más de 1000 páginas.

Nota: Dado que queremos mostrar los usuarios que han leído más de 1.000 páginas, no hay necesidad de utilizar LEFT JOIN o FULL JOIN aquí. Los usuarios que hayan leído 0 páginas serán filtrados con nuestra condición HAVING de todas formas.

Ejercicio 15: Usuarios sin libros prestados

Ejercicio: Mostrar el número total de usuarios que nunca han tomado libros prestados.

Solución:

SELECT COUNT(p.patron_id)
FROM patron p
WHERE NOT EXISTS (
  SELECT * FROM book_loan
  WHERE patron_id = p.patron_id
);

Explicación: Para mostrar sólo los usuarios que nunca han tomado libros prestados, filtre el resultado con una cláusula WHERE NOT EXISTS. Para cualquier usuario que nunca haya tomado libros prestados, no existirá una entrada book_loan entrada con su dirección id. Utilice una subconsulta para encontrar un conjunto de préstamos de libros para cada usuario y, a continuación, utilice el resultado de esa subconsulta en la cláusula WHERE NOT EXISTS. Esto garantizará que todos los usuarios del conjunto resultante no tengan ningún préstamo de libroscorrespondiente.

Por último, utilice la función COUNT() para contar los seleccionados patron_ids.

Ejercicio 16: Autores y públicos

Ejercicio: Para cada autor, muestre cuántos usuarios diferentes han tomado prestado su libro.

Solución:

SELECT
  a.author_name,
  COUNT(DISTINCT patron_id) AS distinct_patrons
FROM author a
JOIN book_author ba
  ON a.author_id = ba.author_id
JOIN book b
  ON b.book_id = ba.book_id
LEFT JOIN book_loan bl
  ON bl.book_id = b.book_id
GROUP BY
  a.author_id,
  a.author_name;

Explicación: Unir cuatro tablas: author, book_author, booky book_loan. Utilice un JOIN regular con las tres primeras tablas y un LEFT JOIN entre book y book_loan. El LEFT JOIN asegurará que incluso si el libro nunca ha sido prestado, seguirá apareciendo en el resultado.

SELECT El resultado de la búsqueda se basa en el nombre del autor y utiliza COUNT(DISTINCT patron_id) para contar todos los usuarios que han tomado libros prestados. Si los libros del autor nunca han sido prestados, COUNT() devolverá 0.

Agrupe el resultado por el ID y el nombre del autor para evitar los errores de los que hablamos antes.

Ejercicio 17: Los libros más antiguos

Ejercicio: Encuentre el libro o libros más antiguos de la base de datos (es decir, el libro o libros con el publication_year más antiguo). Muestre sólo dos columnas: title y publication_year.

Recuerde que puede haber más de un libro con el año de publicación más antiguo.

Solución:

SELECT 
  title,
  publication_year
FROM book
WHERE publication_year = (
  SELECT MIN(publication_year)
  FROM book
);

Explicación: Utilice una subconsulta para encontrar los libros más antiguos. Seleccione sólo el title y el año de publicación de los libros que tengan el publication_year igual al año de publicación más antiguo del sistema. Puede encontrar el publication_year más antiguo con MIN(publication_year). Utilice esta expresión dentro de una subconsulta y, a continuación, compare el publication_year de cada libro con el resultado de la subconsulta.

Ejercicio 18: Patrones más activos

Ejercicio: Encuentre los nombres de todos los usuarios que han tomado prestados un número de libros superior a la media. Indique el número de libros prestados junto con su nombre.

Solución:

SELECT 
  patron_name,
  COUNT(*) AS loan_count
FROM patron
JOIN book_loan 
  ON patron.patron_id = book_loan.patron_id
GROUP BY patron_name
HAVING COUNT(*) > (
  SELECT COUNT(*)
  FROM book_loan
) / (
  SELECT COUNT(*)
  FROM patron
);

Explicación: Une los patron y book_loan y agrupe los resultados por nombre e ID del usuario. Para mostrar sólo los usuarios que han tomado prestados un número de libros superior a la media, utilice la cláusula HAVING comparando el número de préstamos del usuario actual con el número medio de libros prestados por usuario. La media se obtiene dividiendo el número total de préstamos entre el número total de usuarios.

Debido a que / en SQL es una división entera (lo que significa que el resto es descartado) use > (mayor que), no >= (mayor o igual) para comparar los valores en la cláusula HAVING.

Ejercicio 19: El autor más productivo

Ejercicio: Encontrar el autor que escribió más libros.

Solución:

WITH authors_books_count AS (
  SELECT
    author_id,
    COUNT(*) AS book_count
  FROM book_author
  GROUP BY author_id
)
SELECT 
  author_name,
  book_count
FROM author
JOIN authors_books_count abc
  ON author.author_id = abc.author_id
WHERE book_count = (
  SELECT MAX(book_count)
  FROM authors_books_count
);

Explicación: En el CTE authors_books_count, encontramos el número de libros que ha escrito cada autor usando el id de ese autor.

En la consulta externa, seleccionamos los autores cuyo número de libros es igual al número máximo de libros. Utilizamos una subconsulta y la función MAX() para seleccionar el recuento máximo de libros del CTE y compararlo con book_count para cada autor.

¿Ansioso por Más Práctica de Funciones Agregadas SQL?

Y aquí termina este conjunto de prácticas de funciones agregadas SQL. ¡Ahora tus conocimientos de funciones agregadas están al día! Puedes comprobar tus conocimientos teóricos con estas Preguntas de Entrevista GROUP BY.

Hemos cubierto diferentes funciones agregadas, GROUP BY, HAVING ¡y mucho más! Hemos practicado diferentes tipos de JOINs, subconsultas y el trabajo con NULLs. ¿Tienes ganas de más? Echa un vistazo a los ejercicios en nuestro enorme Ejercicio de SQL Track; ¡tiene más de 100 horas de práctica de SQL! O prueba nuestro Práctica mensual de SQLque ofrece un nuevo curso práctico de SQL cada mes.