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.