Sentencia SQL No obtiene datos deseados

Espero te alcance el tiempo para un aporte tuyo, estoy realizando esta consulta usando el motor de BD de Sybase:

SELECT saldos.codigo,
sum(saldos.total) as importe,
'nrodoc' = (select max(facturacion.nrodocu) from facturacion where facturacion.codigo = saldos.codigo)
FROM saldos 
WHERE saldos.codemp = '001'
AND saldos.anio_periodo = '2015'
AND saldos.mes_periodo = '01'
group by saldos.codcliente
order by saldos.codcliente

Obtengo el siguiente resultado:

codigo      importe    nrodoc

100057     65.50       905230

100057     65.50       905500

100057     65.50       906650

100080 150.00 658145

100080 150.00 655645

100080 150.00 654545

No se deberían repetir los códigos. La idea es que me muestre un código a la vez.

Como comentario la tabla facturación también tiene año y mes.

1 Respuesta

Respuesta
2

La verdad es que es un resultado curioso que me plantea ciertas dudas:

¿Es saldos.Codigo clave primaria?

¿Existen varias filas en la tabla saldos con el mismo codigo?

¿Por qué necesitas sacar el max de facturacion. Nrdocu? ¿No te vale con un inner join entre ambas tablas?

Hola gracias por tu rpta, saldos.Código no es llave primaria, en la tabla saldos existen los mismos códigos por periodo, es por eso que al filtrar por el año 2015 y mes enero, ya no se van a repetir.

Por cada periodo existe un código a la vez.

En la tabla facturación.nrodoc existen códigos que también se repiten y también existen los campos año y mes, es por eso que he sacando el max. Aunque me parece que esto de sacar el max esta mal.

Entiendo, entonces si que debes de hacer un INNER JOIN usando los campos de mes y año:

SELECT s.codigo, sum(s.total) as importe, f.nrodocu
FROM saldos s INNER JOIN facturacion f
ON s.codigo = f.codigo AND s.anio_periodo = f.anio_periodo AND s.mes_periodo = f.mes_periodo 
WHERE s.codemp = '001'
AND s.anio_periodo = '2015'
AND s.mes_periodo = '01'
group by s.codcliente
order by s.codcliente

Si estuve haciendo eso y la consulta demora en mostrar los resultados, ya que en la tabla facturación están los códigos de todos los periodos y lógicamente están repetidos, entonces opte por agregar el año y mes de la tabla facturación.

SELECT h.codcliente, c.nrodoc,sum(h.impmestotal)
FROM saldos h
inner join facturacion c on h.codcliente=c.codcliente
WHERE h.anio_periodo = '2015'
and h.mes_periodo = '01'
and c.anio='2015'
and c.mes='01'

Esta consulta también demora en mostrar los resultados. 

Entiendo que, aunque sea lenta, el resultado es el que quieres, ¿no?

Es preferible usar INNER JOIN antes que WHERE ya que es más rápido.

Para que vaya más rápido deberías agregar un índice a las columnas código, mes y año de ambas tablas.

Gracias por contestar, estuve haciendo esta consulta por que se me duplicaban los códigos. Aun así se me duplican y el campo c.nrodoc me muestran valores cero cuando debería mostrarme los nros. de doc.

SELECT h.codcliente, c.nrodoc,sum(h.impmestotal)
FROM hissaldos h
inner join cabfacturacion c on h.codcliente=c.codcliente
WHERE h.anio_periodo = '2015'
and h.mes_periodo = '01'
and c.anio='2015'
and c.mes='01'
group by h.codcliente

Te falta agregar al INNER JOIN las condiciones de igualdad de los campos año y mes de las dos tablas como te he puesto en el ejemplo de arriba

Hice esta consulta pero igual se repiten los códigos y elcampo nrodoc me muestra cero. No se que podría estar haciendo mal.

SELECT h.codcliente, c.nrodoc,sum(h.impmestotal)
FROM hissaldos h
inner join cabfacturacion c on h.codcliente=c.codcliente
and h.anio_periodo=c.anio
and h.mes_periodo=c.mes
WHERE h.anio_periodo = '2015'
and h.mes_periodo = '01'
group by h.codcliente

Agrega c. Nrodoc al GROUP BY para que no te salgan repetidos

Ya lo resolví me faltó poner agrupar tbn por c.nrodoc.

Jejeje, justo te lo acababa de escribir.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas