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:

SELECT * FROM CUENTA
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:
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

Comments: Publicar un comentario

<< Home

This page is powered by Blogger. Isn't yours?