Ver Mensaje Individual
  #1  
Antiguo 01-07-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Reputación: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Desglosar consulta SQL

A veces tenemos que realizar consultas normes o sumamente complicadas.

En lugar de quebrarnos la cabeza veriguando cómo escribirlas y si se ejecutarán tan rápido como queremos en el servidor, podemos desglosar esa consulta en consultas menores, guardarlas en querys distintos y sincronizar estos querys.

Por ejemplo, tenemos una tabla con los campos CODIGO, NOMBRE, CANTIDAD1, CANTIDAD2. Donde CODIGO es la clave primaria,NOMBRE es su denominación y CANTIDAD1, CANTIDAD2 son valores numéricos.

Nos piden que agrupemos por el NOMBRE y sumemos CANTIDAD1 y CANTIDAD2. Lo hariamos asi:

Código SQL [-]
select NOMBRE, sum(CANTIDAD1), sum(CANTIDAD2)
from tabla
group by NOMBRE

El problema es que CANTIDAD1 y CANTIDAD2 pueden contener nulos y basta que un sólo registro tenga un valor nulo para que la suma sea tambien nula.

Como lo hacemos???

Bien... desglosemos esta consulta en otras subconsultas:

Query 1:

Código SQL [-]
select NOMBRE
from tabla
group by NOMBRE

Query 2:

Código SQL [-]
select sum(CANTIDAD1) as TOTAL1
from tabla
where NOMBRE=:NOMBRE
and CANTIDAD1 is not null

Query 3:

Código SQL [-]
select sum(CANTIDAD2) as TOTAL2
from tabla
where NOMBRE=:NOMBRE
and CANTIDAD2 is not null

En el evento 'OnCalcField' del Query1 programamos el siguiente código:

Código Delphi [-]
Query2.close;
Query2.paramByName('NOMBRE').value:=Query1NOMBRE.value;
Query2.open;

Query3.close;
Query3.paramByName('NOMBRE').value:=Query1NOMBRE.value;
Query3.open;

Query1TOTAL1.value:=Query2TOTAL1.value;
Query1TOTAL2.value:=Query3TOTAL2.VALUE;

Donde TOTAL1 y TOTAL2 son dos campos calculados del Query1 que se actualizan con los valores devueltos por las consultas Query2 y Query3.

De esta forma podemos desglosar una consulta y convertirla en consultas más sencillas.
Responder Con Cita