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

viernes, agosto 12, 2005

 

¿ Cómo crear y levantar una base de datos en Sybase SQL Anywhere usando BATs ?

Estimados alumnos,

En respuesta a sus inquietudes expuestas esta mañana, lean la siguiente
información:

El dbinit como el dbeng9 son utilitarios que NO se pueden ejecutar desde
el Interactive SQL porque NO SE TRATAN de setencias SQL (que pueden ser
leídas por un editor de SQL. El Interactive SQL es un editor de SQL).
Además, el dbisql es también un utilitario.

Lo anterior implica que ustedes podrían perfectamente desde un BAT:
Crear el servidor de datos y levantar el mismo. En otro BAT (con el
servidor de datos ya cargado), ejecutar un segundo BAT que contenga el
llamado al utilitario dbisql para la creación de la metadata.

Por ejemplo, el primer archivo BAT podría contener líneas como estas:

"%ASANY9%\win32\dbinit.exe" -p 4096 proyecto.db
"%ASANY9%\win32\dbeng9.exe" proyecto.db -o proyecto.txt

la primera línea crea la base de datos proyecto con un tamaño de página
de datos de 4K y la segunda línea arranca el servidor recién creado.

El segundo archivo BAT tendría esta línea:

"%ASANY9%\win32\dbisql.exe" -c "eng=proyecto;uid=DBA;pwd=SQL" -onerror
exit mycom.sql

En la misma, se hace un llamado al utilitario dbisql que se conecta a la
base de datos recién creada y desde donde se ejecutan sentencias SQL
contenidas en el archivo mycom.sql.

Otro dato importante, es que en Anywhere el servidor y la base de datos
son la misma cosa. O sea, cuando ustedes crean un servidor de datos y lo
levantan (con dbeng9), están creando y levantando una base de datos con
el mismo nombre también. Existe una forma con el dbeng9 en donde pueden
cambiarle el nombre al servidor de datos para que ustedes puedan de esta
forma en un mismo computador levantar múltiples bases de datos. El flag
que se deberá usar para este fin es el: -n

"%ASANY9%\win32\dbeng9.exe" -n pruebaconsol
E:\Tutorial\Consol\pruebaconsol.db

"%ASANY9%\win32\dbeng9.exe" -n pruebablvd
E:\Tutorial\Blvd\pruebablvd.db

Con las sentencias anteriores, se levantan dos bases de datos distintas
en una misma computadora.

IMPORTANTE

Si ustedes quieren incluir en un solo archivo BAT la creación del
servidor de datos, la carga del mismo y la creación de las tablas.
Deberán usar otro utilitario llamado dbspawn antes de llamar al dbeng9.
En las siguientes líneas se muestra el contenido de este archivo BAT.


"%ASANY9%\win32\dbinit.exe" -p 4096 proyecto.db
"%ASANY9%\win32\dbspawn.exe" "%ASANY9%\win32\dbeng9.exe" proyecto.db -o
proyecto.txt
"%ASANY9%\win32\dbisql.exe" -c "eng=proyecto;uid=DBA;pwd=SQL" -onerror
exit mydb.sql

Ahora bien, ¿ qué es el DBSPAWN y para qué sirve ? ... esta es la
explicación en inglés:

"The dbspawn utility is provided to start a server in the background.
dbspawn starts the server in the background and returns with an exit
code of 0 (success) or non-zero (failure). If the server specified in
server-command is already running, dbspawn reports failure.

The dbspawn utility is useful for starting a server from a batch file,
especially when subsequent commands in the batch file require a server
that is accepting requests."

En su caso, el comando siguiente en el archivo BAT es el dbisql.

Esperando que les haya quedado más claro.

Se despide, atentamente,


Ing. Lamelas

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