Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Ayuda SQL Firebird (https://www.clubdelphi.com/foros/showthread.php?t=81746)

marcial 13-12-2012 18:46:05

Ayuda SQL Firebird
 
Hola a todos.
Trabajo con D5, Firebird 2.1 y FibPuls
Mi problema es el siguiente:
Tengo dos tablas: CABECERAS y COBROS en las que se almacenan todos los documentos facturados en una y todos los cobros en otra.
He de sacar un listado y en CADA LINEA ha de aparecer:

Cliente --- Documento --- Fecha --- Importe Documento --- Importe Cobros (SUMA de todos los cobros de ese documento) --- Pendiente Documento

((El documento es único, pero puede haber muchos cobros del mismo documento))

la sentencia que uso es:

Código SQL [-]
SELECT cabeceras.codcliente, Cabeceras.NombreCliente, Cabeceras.SerieDocumento,
 Max(Cabeceras.Fecha) as Fecha, Sum(Cabeceras.TotalFinal) as TotalFinal, Sum(Cobros.ImporteCobro) as ImporteCobro, 
Sum(Cobros.PendienteDocumento) as PendienteDocumento 
from cabeceras left join COBROS on CABECERAS.seriedocumento = cobros.serieDOCUMENTO
group by cabeceras.SerieDocumento, Cabeceras.CodCliente, Cabeceras.NombreCliente order by CABECERAS.CODCLIENTE, CABECERAS.SERIEDOCUMENTO

El resultado que obtengo es:

Si un documento en Cabeceras NO tiene cobros = La linea es correcta.
Si un documento en Cabeceras tiene UN solo cobro = La linea es correcta.

Ahora bien, cuando un documento tiene varios cobros, el importe documento lo suma tantas veces como cobros tenga, es decir:

Si el total euros de un documento es de 100 y se han hecho 4 cobros de 25 cada uno, en la linea pone lo siguiente:

Total Documento 400 -- Total Cobros 100 --- en lugar de poner Total Documento: 100 --- Total Cobros: 100

Espero haberme explicado y que podais ayudarme.

Muchas gracias

olbeup 14-12-2012 09:44:20

Hola Marcial

Como el campo TOTALFINAL es un valor del total de la factura no hay que sumarlas, ésta es la SQL que buscas.
Código SQL [-]
SELECT
    C.CODCLIENTE
    ,C.NOMBRECLIENTE
    ,C.SERIEDOCUMENTO
    ,(SELECT
          MAX(FECHA)
        FROM Cabeceras
        WHERE CODCLIENTE = C.CODCLIENTE
     ) AS FECHACABECERA
    ,TOTALFINAL
    ,(SELECT
          SUM(IMPORTECOBRO)
        FROM Cobros
        WHERE CLIENTECOD = C.CODCLIENTE
     ) AS TOTALIMPORTECOBRADO
    ,(SELECT
          SUM(PENDIENTEDOCUMENTO)
        FROM Cobros
        WHERE CLIENTECOD = C.CODCLIENTE
     ) AS TOTALIMPORTEDOCUMENTO
    ,TOTALFINAL - (SELECT <-- Esta parte es de mi cosecha para hayar el importe pendiente de cobrar
                       SUM(IMPORTECOBRO)
                     FROM Cobros
                     WHERE CLIENTECOD = C.CODCLIENTE
                  ) AS TOTALIMPORTEPENDIENTE
  FROM Cabeceras AS C
  ORDER BY C.CODCLIENTE, C.SERIEDOCUMENTO
Un saludo.

marcial 14-12-2012 14:53:54

Gracias Olbeup por resolverme el problema. Gracias a vuestra ayuda voy entrando en el SQL


La franja horaria es GMT +2. Ahora son las 14:13:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi