Query con inner join doble

Compadre tengo la siguiente consulta: yo cuando ejecuto la consulta omitiendo la parte de cheques me trae bien la parte de cuentascorrientes y si comento la parte de cuentascorrientes me trae bien la parte de cheques, pero si tengo ambos funcionando me trae datos incorrectos. Te pego la query y abajo 3 imágenes para que veas. Espero tu pronta respuesta.
select    cp.razon,
    CASE MAX(cp.tipoPersona)
    WHEN 'CC' THEN ISNULL(SUM(ct.impoDebe-ct.impoHaber) ,0)     
    END as SaldoCTACTE,
    CASE MAX(cp.tipoPersona)
    WHEN 'CC' THEN ISNULL(sum(ch.impoCheque), 0)
    END as SaldoCHEQUE
from    cheques ch
    inner join CABcobranzas cab        on ch.idCABcobranza=cab.idCABcobranza
    inner join ClientesProveedores    cp    on cp.cod_cli = cab.idclienteproveedor
    inner join ctacteclientesproveedores ct    on ct.idclienteproveedor = cp.cod_cli
WHERE    cp.idEmpresa BETWEEN ISNULL(1,cp.idEmpresa)
            AND ISNULL(3,cp.idEmpresa)
    and cp.razon = 'T y L Cueros SA'
GROUP BY    cp.Razon
RETURN
http://img198.imageshack.us/img198/2096/54217422.jpg
http://img98.imageshack.us/img98/8933/38818515.jpg
http://img198.imageshack.us/img198/7154/98597561.jpg
Respuesta
1
Al parecer el problema viene de tus JOINs, hay dos cosas que puedes hacer para corregirlo:
1. Has un listado por cada caso de la cantidad de registros que hay, es decir, un listado para el primer qry de la imagen, y así sucesivamente, esto te permitirá identificar porque tienes esos problemas de data.
2. Lo más seguro es que debas poner LEFT JOIN en todos, prueba esto y tal vez te salga como corresponda.
Ten en cuenta que la solución seria el punto 1, pero el punto 2 es una ayuda para que continúes con tu trabajo.
Hice lo que me dices del left join pero no hay caso, sigue igual, en el caso que lo haga de a partes me da bien el resultado... pero todo junto da cualquier valor.
El problema esta en tu qry entonces, debes que revisar bien están todos los registros que usas como id en el join en la tabla correspondiente, tal vez tengas data de menos en las demás tablas, realiza las validación por partes, cuanta cuantos registros hay en cada uno de los 3 casos y se entiende que debe ser la misma cantidad, de no ser así pasa lo que te puse lineas arriba, no tienes la data completa.
Lo estoy probando de a partes y me sale mal igual, si le pongo left join también.. right join también... ya probé todas las alternativas te pego la query que estoy usando ahora:
select    cp.razon,
    CASE MAX(cp.tipoPersona)
    when 'CC' then ISNULL(SUM(ch.impoCheque) ,0)
    end as cheques,
    CASE MAX(cp.tipoPersona)
    WHEN 'CC' THEN ISNULL(SUM(ct.impoDebe-ct.impoHaber) ,0)     
    end as ctacte
from     clientesproveedores cp
    inner join ctacteclientesproveedores ct    on ct.idclienteproveedor=cp.cod_cli
    inner join cabcobranzas cab         on cab.idclienteproveedor = cp.cod_cli
    inner join cheques ch            on ch.idCABcobranza=cab.idCABcobranza
where
    cp.idEmpresa between 1 and 3 and
    cp.cod_cli between 2000 and 3000
    and ch.fecCheque between '2009/08/28' and '2020/01/01'
group by cp.razon
order by cp.razon ASC
Si comento el join CT y la parte que le corresponde en el Select anda ESPECTACULAR, lo mismo si comento CAB y CH y comento lo mismo en el Select anda ESPECTACULAR, pero todo junto sigue trayendolo mal!
El problema no esta en el JOIN sino en tu data, y en eso no te puedo ayudar.
Pero te puedo dar un truco para que puedas solucionar tu problema, te lo muestro con un ejm:
1. Asumamos q esto es lo que quiero pero no funciona
select  a.col1a a.col2a, b.col1b, b.col2b, c.col1c
from tabla a inner join tabla b on a.ida= b.idb
inner join tabla c on b.idb= c.idc
2. Esto corre bien
select  a.col1a, a.col2a, b.col1b, b.col2b
from tabla a inner join tabla b on a.ida= b.idb
3. Esto corre bien
select  a.col1a, a.col2a, c.col1c
from tabla a inner join tabla c on a.ida= c.idc
4. Eso es el problema que tienes, pero puedes hacer lo sgte:
select x.col1a, x.col2a, x.col2b, x.col2b, y.col1c
from
(
select  a.ida, b.idb, a.col1a, a.col2a, b.col1b, b.col2b    --esto es la parte q corre bien en #2
from tabla a inner join tabla b on a.ida= b.idb
) x
inner join
(
select  a.ida, c.idc, a.col1a, a.col2a, c.col1c        --esto es la parte q corre bien en #3
from tabla a inner join tabla c on a.idb= c.idc
)y on x.ida= y.ida and x.idb= y.idb
Esto debería funcionar, lo que hice fue usar los orígenes distintos que funcionan bien y luego agruparlos, esto es un ejm, la idea es que evalúes si te sirva y en base a eso puedas usarlo, más allá de esto no puedo darte una ayuda porque no tengo tu data y lo más seguro es que el problema sea algo en tus datos.
Suerte.
Brownsea

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas