Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Duda con consulta y firebird 2.1 (https://www.clubdelphi.com/foros/showthread.php?t=57228)

sargento elias 09-06-2008 15:32:26

Duda con consulta y firebird 2.1
 
Buenas tardes, tengo un par de problems.

Tengo 4 tablas. DEP con (ID,NOM),SUR con (ID,IDDEP), LLE con (ID,IDDEP,LIT,FEC) y REP(ID,IDSUR,LIT,FEC).Las claves ajenas son ID+nomtabla

Le voy a pasar por parámetros el NOM de la tabla DEP y y una fecha cualquiera. Necesito sacar la suma de los litros de LLE, la suma de los litros de REP, y la diferencia de las dos, según depósito y hasta la fecha introducida.

Esta es la solución que me han dado:

Código SQL [-]
Select Dep.Id, Isnull(LLE.SumLitLLe,0) SumLitLle, 
                  isnull(Rep.SumLitRep,0) SumLitRep,
                  Isnull(LLE.SumLitLLe,0) - isnull(Rep.SumLitRep,0) LitDif
           From Dep As Dep
      Left Join (
                    Select Id, Sum(Lit) As SumLitLLe
                       From LLE 
                     Where Fec >= :FecIni And
                              Fec <= :FecIni
                  ) LLE 
              On Dep.Id =  LLE.Id 
      Left Join (
                     Select Id, Sum(Lit) As SumLitRep
                       From Rep 
                     Where Fec >= :FecIni And
                              Fec <= :FecIni
                  ) Rep
             On Dep.Id =  Rep.Id 
        Where Dep.Nom = :Nom

Pero Firebird 1.5 no admite el left join(select , como lo podría hacerlo en una consulta?

Y mi segunda duda es que si me instalo firebird 2.1 (que me han recomendado para solucionar este problema), perdería las bases que tengo hechas en 1.5? tendría que hacer algun tipo de instalación extra? IBexpert funcionaría igual?O no cambia nada en ese sentido? Gracias y perdón por la duplicidad de posts.

celades1 09-06-2008 15:45:20

Hola

Debes hacer Backup de la BD 1.5 i restore con 2.0 o 2.1

Yo Aun estoy utilizando la ultima version de 2.0 ya que la version 2.1
hace muy poco que ha salido y solo la he probado unos dias pero mis aplicaciones siquen corriendo con 2.0.
Yo te aconsejaria pasar a 2.0.

Yo habia trabajado con 1.5 y pase a 2.0 sin problemas.

en cuanto a la pregunta ya te conteste en el otro foro y puedo
asegurarte que que en 2.0 te funcionara o sea se pude hacer from de una select por tanto creo que logicamente tambien se puede hacer join de una select


Saludos

sargento elias 09-06-2008 15:51:25

gracias
 
Gracias celades1, lo he vuelto a preguntar por que si me la resuelven me ahorro instalar el 2.0 en todas las máquinas, que además lo he de consultar primero, aunque lo tendré que hacer de todas maneras. Gracias por tu ayuda.

celades1 09-06-2008 16:00:16

Hola

Hombre de poca fe
te loacabo de probar algo parecido a lo tuyo i funciona
Código SQL [-]
select r.vaca,coalesce(la.num1,0)
from repr r
left join (select i.registrer,count(*) num1 from
insemina i
group by i.registrer) la on  la.registrer=r.registre

Si tienes mas dudas , pregunta

Saludos

sargento elias 09-06-2008 16:09:13

Si te creo hombre, pero es que tengo un monton de bases de datos, y soy novel y no me gustaría fastidiarla, aunque la curiosidad me corroe asi que entonces explicame que pasos sigo, Instalo firebird 2.0 (hecho) no se como hacer lo del Backup...help me!

celades1 09-06-2008 16:22:02

Hola

Antes de de instalar el 2.0 debes hacer backup de todas tus BD (sino prueba solo con una y guarda la version de esa bd en 1.5)
Luego desinstalas Firebird 1.5
Instalas 2.0
Restore de la BD

Haces todas las pruebas y cuando quieras si decides volver a la 1.5 desinstalas la 2.0 y vuelves a instalar la 1.5 (Cosa que seria absurda ya que con 2.0 ira todo bien)

Para hacer Backup i restore yo utilizo ibexpert que es una herramienta como muchas otras que hay para trabajar con bd en services tienes las dos opciones.

Todo esto es lo que yo hice para probar la v 2.1 y tampoco tuve problemas pero opte por volver a la 2.0 y esperar otro momento para hacer el cambio

Realmente si no haces backup y restore seguramente que la 2.0 te abriria la bd sin problemas (pero es aconsejable hacer backup i restore). Lo que una vez abierta la Bd con 2.0 es muy probable que esa Bd fisica nop tela pueda abrir la 1.5

No se si me he explicado
No te puedo seguir mas el hilo, ya que un cliente me ha llamado y me voy

Animos

sargento elias 09-06-2008 16:26:32

entendido gracias

sargento elias 10-06-2008 08:44:05

buenassss!

Ya tengo mi versión 2.0 aunque sigo teniendo un problema con la consulta:

Código SQL [-]
Select Dep.Id, coalesce(SumLitLLe,0) SumLitLle,
                  coalesce(SumLitRep,0) SumLitRep,
                  coalesce(SumLitLLe,0) - coalesce(SumLitRep,0) LitDif
           From Depositos  Dep
      left  Join (Select id, Sum(Lit) SumLitLLe,iddep
                       From LLEnado  lle
                     Where Fec <= :Fecha  group by 1,3) LLEnado
              On Dep.Id =  LLEnado.Iddep
               
      Left  Join (Select rep.id, Sum(rep.Lit) SumLitRep,sur.iddep
                       From Repostaje Rep inner join Surtidor sur on rep.idsur = sur.id
                    where Fec <= :Fecha  group by 1,3) Sur
             On sur.iddep = dep.id
        Where Dep.cod = :cod

id Sumlitlle Sumlitrep Diflit
42 100 10 90
42 100 20 80
42 100 30 70
42 200 10 190
42 200 20 180
42 200 30 170

Cuando el resultado debería ser

id Sumlitlle Sumlitrep Diflit
42 300 60 240
A ver si se os ocurre algo, acias

celades1 10-06-2008 10:50:24

Hola

No tengo claro las tablas pero no veo la necesidad de poner los id en los dos group by


Código SQL [-]
Select Dep.Id, coalesce(SumLitLLe,0) SumLitLle,                  coalesce(SumLitRep,0) SumLitRep,                  coalesce(SumLitLLe,0) - coalesce(SumLitRep,0) LitDif           From Depositos  Dep      left  Join (Select Sum(Lit) SumLitLLe,iddep                       From LLEnado  lle                     Where Fec <= :Fecha  group by 2) LLEnado              On Dep.Id =  LLEnado.Iddep                     Left  Join (Select  Sum(rep.Lit) SumLitRep,sur.iddep                       From Repostaje Rep inner join Surtidor sur on rep.idsur = sur.id                    where Fec <= :Fecha  group by 2) Sur             On sur.iddep = dep.id        Where Dep.cod = :cod


Otra Solucion diferente podria ser



Código SQL [-]
 
Select Dep.Id,(Select Sum(Lit) From LLEnado  lle             Where Dep.Id =  LLE.Iddep and lle.Fec <= :Fecha ) SumLitLLe ,              (Select  Sum(rep.Lit) From Repostaje Rep               inner join Surtidor sur on rep.idsur = sur.id              where sur.iddep = dep.id AND Fec <= :Fecha) SumLitRep,             (Select Sum(Lit) From LLEnado  lle             Where Dep.Id =  LLE.Iddep and lle.Fec <= :Fecha )-             (Select  Sum(rep.Lit) From Repostaje Rep               inner join Surtidor sur on rep.idsur = sur.id              where sur.iddep = dep.id AND Fec <= :Fecha) LitDif           From Depositos  Dep


Saludos

sargento elias 10-06-2008 11:02:53

Gracias, funciona.


La franja horaria es GMT +2. Ahora son las 07:03:46.

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