Desarrollo y Depuración de Consultas SQL y Funciones PL/pgSQL
Clasificado en Francés
Escrito el en español con un tamaño de 6,52 KB
Consultas SQL: Ejercicios Resueltos y Optimizados
A continuación, se presentan una serie de consultas SQL, corregidas y optimizadas para una mejor comprensión y ejecución. Cada consulta aborda un escenario específico de manipulación y recuperación de datos en una base de datos relacional.
1. Número de facturas por empleado en la misma provincia y con más de 20 facturas
Esta consulta identifica el número de facturas emitidas por cada empleado, filtrando aquellos que pertenecen a la misma provincia que el empleado con código
'100'
y que han generado más de 20 facturas.SELECT COUNT(*) FROM facturas f JOIN clientes c ON f.codcli = c.codcli JOIN municipios m ON c.codmun = m.codmun WHERE m.codpro = (SELECT m2.codpro FROM municipios m2 JOIN clientes c2 ON c2.codmun = m2.codmun WHERE c2.codcli = '100') GROUP BY f.codcli HAVING COUNT(*) > 20;
2. Vendedor de Segovia: Nombre y Nombre de su Jefe
Consulta para obtener el nombre de un vendedor ubicado en la provincia de Segovia y el nombre de su jefe directo.
SELECT v.nombre AS nombre_vendedor, j.nombre AS nombre_jefe FROM vendedores v JOIN municipios m ON v.codmun = m.codmun JOIN provincias p ON m.codpro = p.codpro JOIN vendedores j ON v.codjefe = j.codven -- Corrección: v.codjefe es el código del jefe de v WHERE p.nombre = 'Segovia';
3. Municipios de Soria con Nombres Duplicados en Otras Provincias
Identifica los nombres de municipios de la provincia de Soria que coinciden con nombres de municipios en cualquier otra provincia.
SELECT DISTINCT m.nombre FROM municipios m JOIN provincias p ON p.codpro = m.codpro WHERE p.nombre = 'Soria' AND m.nombre = ANY (SELECT m2.nombre FROM municipios m2 JOIN provincias p2 ON p2.codpro = m2.codpro WHERE p2.nombre != 'Soria');
4. Artículos con Precio Superior a la Media y Múltiples Compras
Muestra el código y la descripción de artículos cuyo precio es superior al precio medio de todos los artículos y que han sido registrados en más de 3 líneas de factura.
SELECT a.codart, a.descrip FROM articulos a JOIN lineas_fac lf ON a.codart = lf.codart WHERE a.precio > (SELECT AVG(precio) FROM articulos) GROUP BY a.codart, a.descrip HAVING COUNT(lf.codart) > 3;
5. Vendedores que son Jefes: Nombre y Número de Facturas
Obtiene el nombre y el número de facturas realizadas por aquellos vendedores que, a su vez, ejercen como jefes de otros vendedores.
SELECT f.codven, v.nombre, COUNT(*) AS numero_facturas FROM vendedores v JOIN facturas f ON v.codven = f.codven WHERE v.codven IN (SELECT DISTINCT codjefe FROM vendedores WHERE codjefe IS NOT NULL) GROUP BY f.codven, v.nombre;
6. Artículos Facturados por Antonio Blanco con Alto Valor
Lista los códigos de los artículos que han sido facturados por el vendedor 'Antonio Blanco' y cuyo valor total en las líneas de factura supera los 6000€.
SELECT lf.codart FROM lineas_fac lf JOIN facturas f ON f.codfac = lf.codfac JOIN vendedores v ON v.codven = f.codven WHERE v.nombre = 'Antonio Blanco' GROUP BY lf.codart HAVING SUM(lf.precio * lf.cantidad) > 6000;
7. Vendedores de Valladolid sin Facturas: Nombre y Nombre de su Jefe
Muestra el nombre del vendedor y el nombre de su jefe para aquellos vendedores ubicados en Valladolid que no han registrado ninguna factura.
SELECT v1.nombre AS nombre_vendedor, v2.nombre AS nombre_jefe FROM vendedores v1 JOIN vendedores v2 ON v1.codjefe = v2.codven -- Corrección: v1.codjefe es el código del jefe de v1 JOIN municipios m ON v1.codmun = m.codmun JOIN provincias p ON m.codpro = p.codpro WHERE p.nombre = 'Valladolid' AND v1.codven NOT IN (SELECT codven FROM facturas);
8. Vendedor con el Mayor Número de Facturas
Identifica el nombre del vendedor que ha emitido el mayor número de facturas en el sistema.
SELECT v.nombre FROM vendedores v JOIN facturas f ON v.codven = f.codven GROUP BY v.codven, v.nombre HAVING COUNT(f.codfac) >= ALL (SELECT COUNT(f2.codfac) FROM facturas f2 GROUP BY f2.codven);
9. Relación Completa: Municipios, Vendedores y Jefes
Esta consulta presenta una relación exhaustiva entre municipios, vendedores y sus respectivos jefes, incluyendo aquellos municipios que no tienen vendedores asignados y aquellos vendedores que no están asociados a ningún municipio, así como la información del jefe cuando esté disponible.
SELECT m.nombre AS nombre_municipio, t.nombre AS nombre_trabajador, j.nombre AS nombre_jefe FROM municipios m FULL OUTER JOIN vendedores t ON m.codmun = t.codmun LEFT JOIN vendedores j ON t.codjefe = j.codven;
Función PL/pgSQL: Asignación de Calificaciones
A continuación, se presenta una función PL/pgSQL diseñada para asignar calificaciones a los alumnos basándose en sus notas y rangos predefinidos, además de identificar y registrar a los alumnos suspensos.
CREATE OR REPLACE FUNCTION asign_calificacion(cod VARCHAR(3)) RETURNS INT AS $$
DECLARE
calif listado_calificaciones%ROWTYPE;
alum alumnos%ROWTYPE;
contador INT := 0;
BEGIN
FOR calif IN SELECT * FROM listado_calificaciones LOOP
UPDATE alumnos
SET calificacion = calif.calificacion
WHERE cod_asignatura = cod
AND nota >= calif.limite_inferior -- Se cambió a >= para incluir el límite inferior
AND nota < calif.limite_superior;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'Error en la actualización de calificaciones para el rango de nota %s a %s.', calif.limite_inferior, calif.limite_superior;
EXIT; -- Sale del bucle si ocurre un error en la actualización
END LOOP;
FOR alum IN SELECT * FROM alumnos LOOP
IF alum.nota < 5 THEN
INSERT INTO alumnos_suspensos (cod_alumno, cod_asignatura) -- Se especifican las columnas
VALUES (alum.cod_alumno, alum.cod_asignatura);
contador := contador + 1;
END IF;
END LOOP;
RETURN contador;
END;
$$ LANGUAGE plpgsql;