Ejercicios Resueltos de Consultas SQL Avanzadas
A continuación, se presenta la corrección y optimización de diez ejercicios prácticos de consultas SQL, enfocados en el manejo de filtros complejos, ordenamiento, cálculos y sintaxis específica de bases de datos (como Access/Jet SQL).
1. Filtrado Combinado por Patrón y Conjunto de Estados
Requerimiento: Recuperar todos los campos de la tabla Clientes cuya compañía termine en una letra entre ‘b’ y ‘t’, y cuyo estado o provincia sea ‘NY’, ‘FL’, ‘TN’, ‘UT’ o ‘MA’. El resultado debe estar ordenado de Z a A por Cargo, y luego por Compañía de A a Z. Se prohíbe el uso del operador OR.
Consulta SQL Corregida:
SELECT *
FROM Clientes
WHERE Compañía LIKE '*[b-t]'
AND [Estado o Provincia] IN ('MA', 'NY', 'UT', 'TN', 'FL')
ORDER BY Cargo DESC, Compañía ASC;2. Obtención de Registros Superiores con Filtro Temporal
Requerimiento: Obtener los 7 registros con los mayores valores de Cantidad de la tabla Transacciones de Inventario. Solo interesan aquellos realizados el día 24 de cualquier mes (según la Fecha de Creación) y cuyo Tipo de Transacción sea ‘comprado’ (asumiendo que ‘comprado’ corresponde al valor 1).
Consulta SQL Corregida:
SELECT TOP 7 *
FROM [Transacciones de Inventario]
WHERE Day([Fecha de Creación de la Transacción]) = 24
AND [Tipo de Transacción] = 1
ORDER BY Cantidad DESC;3. Formato de Fecha Personalizado y Exclusión por Mes
Requerimiento: Obtener en una sola columna (con encabezado) el día, mes y año de cada registro de Pedidos de Compra, siempre que el mes de la Fecha de Creación no coincida con el mes actual de ejecución de la consulta. El formato de recuperación debe ser DD.MM.AAAA.
Consulta SQL Corregida:
SELECT Day([Fecha de Creación]) & '.' & Month([Fecha de Creación]) & '.' & Year([Fecha de Creación]) AS NuevoFormatoFecha
FROM [Pedidos de Compra]
WHERE Month([Fecha de Creación]) <> Month(Date());4. Cálculo de Costo Estándar con Conversión de Moneda
Requerimiento: Aumentar un 12% el Costo Estándar de cada Producto cuya Cantidad por Unidad no contenga las siglas ‘paq.’. El valor resultante (almacenado en euros) debe convertirse a libras (1€ = 0.880557 libras) y redondearse a 4 cifras decimales. Se debe recuperar una única columna con el valor en libras y su símbolo, ordenada de mayor a menor.
Consulta SQL Corregida:
SELECT Round([Costo Estándar] * 1.12 * 0.880557, 4) & ' £' AS CostoEnLibras
FROM Productos
WHERE [Cantidad por Unidad] NOT LIKE '*paq.*'
ORDER BY 1 DESC;5. Consulta a una Base de Datos Externa
Requerimiento: Realizar una consulta desde la base de datos actual hacia una base de datos externa (BDCOPIATUNOMBRE) para obtener, sin repeticiones, los distintos tipos de Cargos de la tabla TUNOMBRE (que es la copia renombrada de Proveedores).
Consulta SQL Corregida:
SELECT DISTINCT Cargo
FROM [TuNombre] IN 'RUTADELAOTRABASEDEDATOS';6. Filtrado Complejo con Operador Lógico Exclusivo (XOR)
Requerimiento: Listar todos los campos de la tabla Detalles de Pedidos de Compra que cumplan alguna de las siguientes condiciones:
- El campo Publicado en el Inventario no esté chequeado (
False). - De forma exclusiva (XOR), la Fecha de Recepción esté entre el 05/04/2006 y el 10/04/2006.
Además, se deben incluir aquellos registros cuyo ID de Inventario esté vacío (NULL). El resultado debe ordenarse por el tercer campo recuperado.
Consulta SQL Corregida:
SELECT *
FROM [Detalles de Pedidos de Compra]
WHERE ([Publicado en el Inventario] = False XOR [Fecha de Recepción] BETWEEN #05/04/2006# AND #10/04/2006#)
OR [ID de Inventario] IS NULL
ORDER BY 3;7. Uso de Nombres de Campo Cualificados y Condiciones Múltiples
Requerimiento: Obtener Apellidos, Nombre, Ciudad y Notas de los Empleados que cumplan: (tengan notas con contenido en Redmond) O (tengan notas sin contenido en Seattle). Es obligatorio usar nombres de campo cualificados.
Consulta SQL Corregida:
SELECT Empleados.Apellidos, Empleados.Nombre, Empleados.Ciudad, Empleados.Notas
FROM Empleados
WHERE (Empleados.Notas IS NOT NULL AND Empleados.Ciudad = 'Redmond')
OR (Empleados.Ciudad = 'Seattle' AND Empleados.Notas IS NULL);8. Filtrado por Patrón Específico y Exclusión de Sufijo
Requerimiento: Listar todos los campos de Productos cuyo Código de Producto contenga un ‘9’ inmediatamente después de un guion, y cuya Cantidad por Unidad no termine en ‘piezas’. Ordenar por el Nombre del Producto de Z a A.
Consulta SQL Corregida:
SELECT *
FROM Productos
WHERE [Código de Producto] LIKE '*-9*'
AND [Cantidad por Unidad] NOT LIKE '*piezas'
ORDER BY [Nombre del Producto] DESC;9. Concatenación de Campos y Filtrado por Cargo
Requerimiento: Mostrar en una sola columna concatenada (con encabezado adecuado) los Apellidos, Nombre, el texto descriptivo y la clave primaria (ID) de todos los Proveedores que sean algún tipo de ‘Jefe’ o ‘Ayudante de Marketing’. Ordenar por Apellidos de Z a A.
Consulta SQL Corregida:
SELECT '"' & Apellidos & ', ' & Nombre & '" tiene por clave primaria en la base de datos el número: ' & ID AS InformeCompleto
FROM Proveedores
WHERE Cargo LIKE 'Jefe*' OR Cargo = 'Ayudante de Marketing'
ORDER BY Apellidos DESC;10. Uso de Parámetros de Usuario y Operador BETWEEN
Requerimiento: Listar de la tabla Pedidos el ID de Pedido, la diferencia de días entre el pedido y el envío, y los Gastos de Envío. Se deben incluir solo aquellos pedidos con una diferencia de envío igual o inferior a 5 días, y cuyos gastos de envío estén comprendidos entre dos valores que elija el usuario mediante una ventana de parámetros. Es obligatorio usar el operador BETWEEN.
Consulta SQL Corregida:
SELECT [ID de Pedido], [Fecha de Envío] - [Fecha de Pedido] AS [Diferencia de Días], [Gastos de Envío]
FROM Pedidos
WHERE ([Fecha de Envío] - [Fecha de Pedido]) <= 5
AND [Gastos de Envío] BETWEEN [Introduzca Gasto Mínimo] AND [Introduzca Gasto Máximo];