jueves, agosto 18, 2005
Solución de Problema SQL: (Funciones agregadas compuestas)
El día de hoy, mientras se revisaban consultas y sentencias SQL mal construídas, analizamos la siguiente sentencia: Incrementar en un 5% el saldo de todas aquellas cuentas bancarias con saldo MAYOR al MAYOR saldo promedio de las cuentas por sucursal.
UPDATE Cuenta
SET Saldo = Saldo * 1.05
WHERE Saldo > (SELECT MAX(AVG(Saldo))
FROM CUENTA
GROUP BY NombreSucursal) --- SQL INCORRECTO
La sentencia de actualización anterior tiene un problema y es que básicamente el ANSI SQL NO SOPORTA funciones agregadas compuestas; es decir, es completamente incorrecto querer calcular el valor máximo de un promedio como se ilustra en el ejemplo.
La sentencia SQL que resuelve el problema expuesto es esta:
--- SQL CORRECTO ---
UPDATE Cuenta
SET Saldo = Saldo * 1.05
WHERE Saldo > ( SELECT MAX (V.Promedio)
FROM (SELECT AVG (Saldo) AS Promedio
FROM Cuenta
GROUP BY NombreSucursal) AS V )
Observen que se aplica la función agregada MAX sobre un atributo renombrado Promedio de una tabla renombrada V que aparece en el FROM del SELECT MAX ...
La tabla V es una consulta (query) que contiene el promedio del saldo de las cuentas por sucursal. Entonces, se concluye que en el FROM se puede tener un query completo que deberá colocarse entre paréntesis y renombrarse (en este caso, se le nombró con la letra V). En el SELECT MAX se hace referencia al atributo renombrado Promedio de la tabla renombrada V.
NOTAS ADICIONALES:
WHERE Saldo > ( SELECT MAX (V.Promedio)
FROM (SELECT AVG (Saldo) AS Promedio
FROM Cuenta
GROUP BY NombreSucursal) AS V )
CREATE TABLE Cuenta (NCuenta INTEGER NOT NULL, Saldo MONEY,NombreSucursal VARCHAR(40) PRIMARY KEY (Cuenta) );
Luego, deberán ingresar una serie de tuplas que contengan datos para distintas sucursales.
Finalmente, probar las sentencias SQL.
Saludos y suerte en sus pruebas !!
Ing. Lamelas
UPDATE Cuenta
SET Saldo = Saldo * 1.05
WHERE Saldo > (SELECT MAX(AVG(Saldo))
FROM CUENTA
GROUP BY NombreSucursal) --- SQL INCORRECTO
La sentencia de actualización anterior tiene un problema y es que básicamente el ANSI SQL NO SOPORTA funciones agregadas compuestas; es decir, es completamente incorrecto querer calcular el valor máximo de un promedio como se ilustra en el ejemplo.
La sentencia SQL que resuelve el problema expuesto es esta:
--- SQL CORRECTO ---
UPDATE Cuenta
SET Saldo = Saldo * 1.05
WHERE Saldo > ( SELECT MAX (V.Promedio)
FROM (SELECT AVG (Saldo) AS Promedio
FROM Cuenta
GROUP BY NombreSucursal) AS V )
Observen que se aplica la función agregada MAX sobre un atributo renombrado Promedio de una tabla renombrada V que aparece en el FROM del SELECT MAX ...
La tabla V es una consulta (query) que contiene el promedio del saldo de las cuentas por sucursal. Entonces, se concluye que en el FROM se puede tener un query completo que deberá colocarse entre paréntesis y renombrarse (en este caso, se le nombró con la letra V). En el SELECT MAX se hace referencia al atributo renombrado Promedio de la tabla renombrada V.
NOTAS ADICIONALES:
- Cuando se esté interactuando con una base de datos en ambiente de producción (ambiente real), se recomienda lo siguiente: ANTES de aplicar la sentencia UPDATE, ejecutar la sentencia SELECT equivalente. En el ejemplo CORRECTO, la sentencia SELECT sería esta:
WHERE Saldo > ( SELECT MAX (V.Promedio)
FROM (SELECT AVG (Saldo) AS Promedio
FROM Cuenta
GROUP BY NombreSucursal) AS V )
- Si ustedes quieren probar las sentencias SQL expuestas en esta nota, deberán ejecutar una sentencia DDL como la siguiente:
Luego, deberán ingresar una serie de tuplas que contengan datos para distintas sucursales.
Finalmente, probar las sentencias SQL.
Saludos y suerte en sus pruebas !!
Ing. Lamelas