PR0304 — Consultes SQL avançades
Informació de la pràctica
| Camp | Valor |
|---|---|
| Codi | PR0304 |
| mòdul | M0372 — Gestió de Bases de Dades |
| RA | RA4 — Consultes SQL |
| Durada estimada | 5 hores |
| Modalitat | Individual |
| Lliurament | Fitxer SQL + informe PDF a Moodle |
| Qualificació | 10 punts (rúbrica adjunta) |
Descripció
Aquesta pràctica consisteix a escriure i executar consultes SQL progressivament complexos sobre la base de dades dissenyada i implementada a les pràctiques PR0302 i PR0303. L'objectiu és demostrar domini del SELECT en totes les seves formes.
Configuració
Assegureu-vos que el vostre contenidor Docker amb PostgreSQL (PR0303) està en marxa i té dades de prova:
docker start postgres-nom-cognom
docker exec -it postgres-nom-cognom psql -U gbd_user -d gbd_nom_cognom
Si la vostra BD de pràctiques no te prou dades, podeu afegir-ne amb els INSERT de la pràctica PR0302 o amb dades generades.
Bloc 1 — Consultes bàsiques (2 punts)
Escriviu una consulta SQL per a cadascun dels requisits:
- Llista de tots els usuaris ordenats per cognom i nom (alfabèticament).
- Instal·lacions actives, mostrant nom, tipus i preu per hora, ordenades per preu de mes car a mes econòmic.
- Reserves de l'any actual, mostrant el nom de l'usuari, la instal·lació i la data.
- El nombre total d'usuaris registrats al sistema.
- Les 5 instal·lacions mes barates.
- Usuaris que és van registrar en els últims 90 dies.
- Instal·lacions que no són ni "tenis" ni "padel" (useu NOT IN).
- Reserves on la durada es de més de 2 hores (calculada com EXTRACT o DATEDIFF entre hora_fi i hora_inici).
Bloc 2 — Agrupació i funcions (2 punts)
- Nombre de reserves per usuari (mostra el nom de l'usuari i el comptador). Inclou usuaris amb 0 reserves.
- Ingressos totals per instal·lació (agrupat per instal·lació, calculant preu_hora * durada per a cada reserva). Ordena de mes a menys.
- Nombre de reserves per mes i any (any-mes, nombre de reserves). Ordena cronologicament.
- Instal·lacions amb una ocupació mitjana superior a 1 hora per reserva.
- L'usuari que ha gastat més diners en reserves.
- Resum estadístic del preu de les reserves: mínim, màxim, mitjana i desviació estàndard.
Bloc 3 — JOINs (3 punts)
- Totes les reserves amb el nom complet de l'usuari, el nom de la instal·lació, la data i la durada. Ordena per data descendent.
- Usuaris i la seva última reserva (data i instal·lació). Inclou usuaris sense cap reserva.
- Instal·lacions que mai s'han reservat.
- Reserves en estat "confirmada" amb les dades completes de l'usuari i de la instal·lació.
- Si la vostra BD te monitors: reserves amb monitor assignat, mostrant el nom del monitor i la seva especialitat.
- Usuaris que han reservat més d'una instal·lació diferent (amb JOINs i GROUP BY).
Bloc 4 — Subconsultes i CTEs (3 punts)
- Instal·lacions amb un preu per hora superior a la mitja de totes les instal·lacions del mateix tipus.
- Usuaris que han fet almenys una reserva al mes actual (usa EXISTS).
- Usuaris que mai han fet cap reserva (usa NOT EXISTS).
- Les 3 instal·lacions mes reservades, amb el total d'ingressos generats (usa una CTE o derived table).
- Per a cada usuari, la instal·lació que ha reservat mes sovint. (Subconsulta correlacionada avançada — opcional, +0.5 punts extres)
- Reescriviu la consulta del punt 1 d'aquest bloc usant una CTE en lloc d'una subconsulta.
Format de lliurament
Creeu un fitxer consultes_pr0304.sql amb:
- Cada consulta numerada i amb un comentari que indica el requisit.
- Les consultes han d'executar-se sense errors a PostgreSQL.
- Incloeu al final de cada consulta un comentari amb el nombre de files retornades per les vostres dades de prova.
-- Bloc 1, Consulta 1: Llista d'usuaris ordenada alfabèticament
SELECT nom, cognoms, email
FROM usuaris
ORDER BY cognoms, nom;
-- Resultat: 12 files
Adjunteu un informe PDF amb captures de pantalla dels resultats de les 5 consultes que considereu mes representatives.
Validació de les consultes
després d'escriure cada consulta, analitzeu el resultat: té sentit? El nombre de files és l'esperat? Si la consulta retorna moltes mes files de les esperades, pot ser que us falti una condicio de JOIN o que tingueu un producte cartesià accidental.