Ver Mensaje Individual
  #5  
Antiguo 09-03-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Reputación: 21
gluglu Va por buen camino
La subconsulta que quieres hacer, entiendo yo, es para devolverte un valor determinado para cada registro de la consulta principal.

Pues lo que tienes que hacer es pedir ese valor para cada registro de los que devuelve la consulta principal.

Tu consulta principal
Código SQL [-]
Select A.NOMBRE, U.NOMBRE UNIDAD, C.NOMBRE CATEGORIA, cast(sum(E.IMPORTE) as float) IMPORTEENTRADA,
       cast(sum(E.CANTIDAD) as integer) CANTIDADENTRADA, cast(sum(S.IMPORTE) as float) IMPORTESALIDA, cast(sum(S.CANTIDAD) as integer) CANTIDASALIDA

from ARTICULOS A
left join NOTASCREDITO E on E.ARTICULO = A.CLAVE
left join SALIDAS S on S.ENTRADA = E.CLAVE
left join CATEGORIAS C on A.CATEGORIA = C.CLAVE
left join UNIDADES U on A.UNIDAD = U.CLAVE

where (S.FECHA between :INICIAL and :FINAL) or (E.FECHA between :INICIAL and :FINAL)

group by C.NOMBRE, A.NOMBRE, U.NOMBRE

te devuelve los valores que quieres. Ahora, adicionalmente, tienes que añadirle la petición de datos del mes anterior a la consulta actual. Entiendo que la clave principal del fichero Articulos es A.CLAVE.

Lo que creo que quieres es obtener otros valores para esa CLAVE del fichero ARTICULOS, no ?

El error que mencionabas en tu primer post es porque la 'subconsulta' que habías intentado en un principio te devuelve resultados múltiples, varios registros, y esto Firebird no lo permite. Por otro lado, la subconsulta va a tomar los datos de referencia de la consulta principal.

La verdad es que hice el Select que posté a la rápida y no me dí cuenta de algunas cosas. Este está más afinado ....

Código SQL [-]
Select A.CLAVE, A.NOMBRE, U.NOMBRE UNIDAD, C.NOMBRE CATEGORIA,
       cast(sum(E.IMPORTE) as float) IMPORTEENTRADA,
       cast(sum(E.CANTIDAD) as integer) CANTIDADENTRADA,
       cast(sum(S.IMPORTE) as float) IMPORTESALIDA,
       cast(sum(S.CANTIDAD) as integer) CANTIDASALIDA,
 
(Select cast(sum(E2.IMPORTE as float) from NOTASCREDITO E2
 where E2.ARTICULO = A.CLAVE
 and E2.FECHA between :INIMESANTERIORL and :FINMESANTERIOR) as IMPENT_MESANTERIOR,
 
(Select cast(sum(S2.IMPORTE as float) from NOTASCREDITO E2
 left join SALIDAS S2 on S2.ENTRADA = E2.CLAVE
 where E2.ARTICULO = A.CLAVE
 and S2.FECHA between :INIMESANTERIOR and :FINMESANTERIOR) as IMPSAL_MESANTERIOR
 
from ARTICULOS A
left join NOTASCREDITO E on E.ARTICULO = A.CLAVE
left join SALIDAS S      on S.ENTRADA = E.CLAVE
left join CATEGORIAS C   on A.CATEGORIA = C.CLAVE
left join UNIDADES U     on A.UNIDAD = U.CLAVE
 
where (S.FECHA between :INICIAL and :FINAL) or (E.FECHA between :INICIAL and :FINAL)
 
group by A.CLAVE, C.NOMBRE, A.NOMBRE, U.NOMBRE

La consulta principal está igual que tu la has planteado al principio.

Te muestro el ejemplo para que además obtengas dos valores adicionales para cada registro de tu consulta principal, que corresponden con cada una de las subconsultas expuestas.

La primera subconsulta
Código SQL [-]
(Select cast(sum(E2.IMPORTE as float) from NOTASCREDITO E2
 where E2.ARTICULO = A.CLAVE
 and E2.FECHA between :INIMESANTERIORL and :FINMESANTERIOR) as IMPENT_MESANTERIOR,
coge el valor A.CLAVE directamente de la consulta principal para buscar el valor que corresponda en NOTASCREDITO dentro del margen de fechas que desees. El nombre de la columna, IMPENT_MESANTERIOR se coloca al final, fuera de la subconsulta.

La segunda subconsulta es un pco más compleja :
Código SQL [-]
(Select cast(sum(S2.IMPORTE as float) from NOTASCREDITO E2
 left join SALIDAS S2 on S2.ENTRADA = E2.CLAVE
 where E2.ARTICULO = A.CLAVE
 and S2.FECHA between :INIMESANTERIOR and :FINMESANTERIOR) as IMPSAL_MESANTERIOR
Ya que no hay una referencia directa en SALIDAS a la CLAVE en ARTICULO, por lo que he podido ver en tu consulta principal, hace falta pasar por NOTASCREDITO previamente, así que la suma se hará sobre S2.IMPORTE, habiendo previamente realizado un join entre SALIDAS y NOTASCREDITO.

Insisto, no he probado el Select pero mas o menos esta es la idea. Es cuestión de que vayas probando y viendo qué resultados te interesa obtener.

Si tienes dudas adicionales ....

... se me olvidaba. Debes de asegurarte que la consulta principal esté agrupada no sólo por el nombre del artículo, que puede o no ser único, sino por CLAVE que supongo que sí que será única. Podría darse el caso de que existiese un mismo nombre para dos artículos.
__________________
Piensa siempre en positivo !
Responder Con Cita