Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-07-2008
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Hola, poliburro, gracias por responder

Tu consulta no he podido ejecutarla, me dice que la expresión de combinación no esta admitida, serán cosas del ADO

Realmente, el problema es el siguiente, si de la clausula FROM
Código Delphi [-]
   FROM (recibos  LEFT JOIN ingresos ON recibos.ID_CLAVE = ingresos.ID_RECIBO) LEFT JOIN gastos ON recibos.ID_CLAVE = gastos.ID_RECIBO
elimino una de las relaciones enlazadas con LEFT JOIN, entonces suma bien, solo presenta el problema cuando se utilizan todas las tablas.

Salvica
Responder Con Cita
  #2  
Antiguo 16-07-2008
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
No, no es problema de ADO.

La consulta que te he posteado es la que debes utilizar, pues evita precisamente que se te dupliquen las filas. Que motor utilizas?
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #3  
Antiguo 16-07-2008
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Las tablas están en formato DBF (es una aplicación vieja y necesitan sacar algunos datos), para conectarme utilizo Microsoft.Jet.OLEDB.4.0 con Zeos (ZConnection y ZQuery)
Responder Con Cita
  #4  
Antiguo 17-07-2008
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Cita:
Empezado por poliburro Ver Mensaje
No, no es problema de ADO.

La consulta que te he posteado es la que debes utilizar, pues evita precisamente que se te dupliquen las filas. Que motor utilizas?
LLevas razón, no es problema de ADO, si no del SQL.

Según explican aquí, un "Left Join" NO PERMITE anidar un "Inner Join" en su interior, así que con tu consulta y las explicaciones de la página anterior lo he resuelto asi (para los que tengan el mismo problema):

- 1º Seleccionamos los TOTALES de ingresos de cada recibo (deben salir todos, estén o no a cero o nulo)
Código SQL [-]
         SELECT R1.ID_CLAVE AS ID_RECIBO, R1.MONTH AS MONTH
                SUM(ingresos.CANTIDAD) AS ING_CANTIDAD, 
                SUM(ingresos.IVA) AS ING_IVA, 
                SUM(ingresos.RETENCION) AS ING_RETENCION, 
                SUM(ingresos.TOTAL) AS ING_TOTAL
           FROM recibos AS R1 LEFT JOIN ingresos ON R1.ID_CLAVE = ingresos.ID_RECIBO
          WHERE R1.ID_INQUILI = "0000000001" AND R1.ID_PROPIED = "100000000"
          GROUP BY R1.ID_CLAVE, R1.ID_MONTH

- 2º Seleccionamos los TOTALES de gastos de cada recibo (igual que en el caso anterior)
Código SQL [-]
         SELECT R2.ID_CLAVE AS ID_RECIBO, R2.MONTH AS MONTH,
                SUM(gastos.CANTIDAD) AS GAST_CANTIDAD, 
                SUM(gastos.IVA) AS GAST_IVA, 
                SUM(gastos.RETENCION) AS GAST_RETENCION, 
                SUM(gastos.TOTAL) AS GAST_TOTAL
           FROM recibos AS R2 LEFT JOIN gastos ON R2.ID_CLAVE = gastos.ID_RECIBO
          WHERE R2.ID_INQUILI = "0000000001" AND R2.ID_PROPIED = "100000000"
          GROUP BY R2.ID_CLAVE, R2.MONTH AS MONTH,

- Como tenemos dos resultados con el mismo número de filas (los recibos), ahora podemos unirlas
Código SQL [-]
SELECT DatIngresos.ID_RECIBO, DatIngresos.MONTH,
       ING_CANTIDAD, ING_IVA, ING_RETENCION, ING_TOTAL, 
       GAST_CANTIDAD, GAST_IVA, GAST_RETENCION, GAST_TOTAL
  FROM (
         SELECT R1.ID_CLAVE AS ID_RECIBO, R1.MONTH AS MONTH
                SUM(ingresos.CANTIDAD) AS ING_CANTIDAD, 
                SUM(ingresos.IVA) AS ING_IVA, 
                SUM(ingresos.RETENCION) AS ING_RETENCION, 
                SUM(ingresos.TOTAL) AS ING_TOTAL
           FROM recibos AS R1 LEFT JOIN ingresos ON R1.ID_CLAVE = ingresos.ID_RECIBO
          WHERE R1.ID_INQUILI = "0000000001" AND R1.ID_PROPIED = "100000000"
          GROUP BY R1.ID_CLAVE, R1.ID_MONTH
       ) AS DatIngresos
  INNER JOIN
       (
         SELECT R2.ID_CLAVE AS ID_RECIBO, R2.MONTH AS MONTH,
                SUM(gastos.CANTIDAD) AS GAST_CANTIDAD, 
                SUM(gastos.IVA) AS GAST_IVA, 
                SUM(gastos.RETENCION) AS GAST_RETENCION, 
                SUM(gastos.TOTAL) AS GAST_TOTAL
           FROM recibos AS R2 LEFT JOIN gastos ON R2.ID_CLAVE = gastos.ID_RECIBO
          WHERE R2.ID_INQUILI = "0000000001" AND R2.ID_PROPIED = "100000000"
          GROUP BY R2.ID_CLAVE, R2.MONTH AS MONTH,
       ) AS DatGastos
    ON (DatIngresos.ID_RECIBO = DatGastos.ID_RECIBO)
Caso cerrado
Gracias a tod@s

Salvica
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Yo, soy rebelde porque el mundo me ha hecho así dec La Taberna 21 17-04-2008 12:17:33
StringGrid Rebelde EUFORIA C++ Builder 5 25-02-2008 07:44:09
Realizar una consulta sobre los registros que devuelve otra consulta Borjaserrano Firebird e Interbase 12 01-10-2007 23:19:44
Consulta dentro de otra consulta judit25 Conexión con bases de datos 1 25-06-2007 15:52:15
Componente rebelde ChangoPro OOP 7 23-10-2003 05:52:54


La franja horaria es GMT +2. Ahora son las 01:25:56.


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