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 02-12-2006
aladelta aladelta is offline
Miembro
 
Registrado: jul 2003
Posts: 70
Poder: 21
aladelta Va por buen camino
union de select

Hola a todos;

Necesito que alguien encienda una vela en este tunel tan oscuro....

Primero paso a relatar lo que estoy haciendo y despues expongo mis dudas sobre como poder realizar esta consulta...
Tenemos una tabla llamada diario en la que tenemos 3 campos, cuentad,cuentah,importe..con estos valores
Cita:
cuentad cuentah importe
32100001 200.00
40000001 200.00
40000003 200.00
40000001 300.00
40000002 200.00
Mi interes es realizar una consulta para obtener la suma de los importes agrupados por cuentad y cuentah a si mismo desechar las cuentas que no empiezen por 4 y que los importes a sumar sean superiores a una cantidad cierta, de esta manera...
Código:
select cuentad as cuenta, sum(importe) as saldo 
from diario 
where cuentad like '4%'
group by cuentad having sum(importe)>99.99
Y la vista resultante seria asi

Cita:
cuenta saldo
40000001 200.00
40000003 200.00
Bien, ahora hago la union con otro select para realizar la misma operacion con el otro campo cuentah, con lo que la consulta sql quedaria de esta manera
Código:
select cuentad as cuenta, sum(importe) as saldo 
from diario 
where cuentad like '4%'
group by cuentad having sum(importe)>99.99
union
select cuentah as cuenta, sum(importe) as saldo 
from diario
where cuentah like '4%'
group by cuentah having sum(importe)>99.99
La consulta da unos resultados correctos como estos
Cita:
cuenta saldo
40000001 200.00
40000001 300.00
40000002 200.00
40000003 200.00
Ahora mi problema, mi pregunta, mis dudas se centran en que obtengo cuentas duplicadas y necesito dejar solamente una que sea la que tenga mayor saldo, para obtener una consulta correcta para mi con estos resultados
Cita:
cuenta saldo
40000001 300.00
40000002 200.00
40000003 200.00
Y estoy volviendome de color verde palido porque llevo buscando algo parecido en los foros pero no encuentro nada, por favor, alguien que me encienda la vela.....

Gracias....
Responder Con Cita
  #2  
Antiguo 02-12-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
He tenido que buscar tus últimos mensajes para ver qué Bases de datos usas. Si es Firebird, usa un procedimiento almacenado. Será más fácil.

Código SQL [-]
CREATE PROCEDURE Saldos()
RETURNS (
    cuenta varchar(..)
    saldo NUMERIC(10,2))
AS
declare variable saldod numeric(10,2);
declare variable cuentad varchar(...);

declare variable saldoh numeric(10,2);
declare variable cuentah varchar(...);
begin

  for select cuentad , sum(importe) as saldod 
  from diario 
  where cuentad like '4%'
  group by cuentad having sum(importe)>99.99
  into :cuentad, :saldod do // guardamos el registro en esas 2 variables
  begin
    for select cuentah, sum(importe) as saldoh 
    from diario
    where cuentah = :cuentad
    group by cuentah having sum(importe)>99.99
    into :cuentah , :saldoh do
    begin
       if  :saldoh > :saldod then
          :saldo  := saldoh
      else
          :saldo := saldod;
      :cuenta := cuentah;
     Suspend; // devolvemos cuentah que es igual que cuentad 
               //y el saldo mayor de los dos
  end;
end;

Lo que hace un For select ... into ... do es buscar cada registro y guardarlo en las variables que van despues de la palabra reservada "into", como ves, después hay otro for select ... into que busca la misma cuenta en el Haber, guardamos ambos saldos, se compara para saber quien es el mayor y por último se devuelve con Suspend los valores en sus parámetros de salida (que son los que vienen después del RETURNS)

La explicación es algo liosa, tendrás que masticar un poco las sentencias que he puesto de memoria, por tanto, no seas muy duro conmigo .

después en Delphi, solo tienes que hacer:
Código Delphi [-]
query1.sql.text := 'select * from saldos';
query1.Open;

PD: Si antes estabas de color verde pálido, ahora cambiarás a violeta

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 02-12-2006 a las 15:07:11.
Responder Con Cita
  #3  
Antiguo 02-12-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Cita:
Empezado por Lepe
He tenido que buscar tus últimos mensajes para ver qué Bases de datos usas.
Vaya, para que vean qeu deseos no faltan para ayudar.

Saludos
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #4  
Antiguo 02-12-2006
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
ando mas dormido que despierto, pero tambien podrias poner la consulta en una vista y despues usar algo asi como:

select cuenta, Max(Saldo) from vista
group by cuenta
Responder Con Cita
  #5  
Antiguo 02-12-2006
aladelta aladelta is offline
Miembro
 
Registrado: jul 2003
Posts: 70
Poder: 21
aladelta Va por buen camino
Hola de nuevo
Acabo de llegar y veo ya las buenas intenciones de todos....Y ya lo creo vtdeleon, solo con el hecho de decir algo ya tienes mejores intenciones que el que solo entra para nutrirse de las ideas que aqui se prestan....

Bien es verdad que deberia haber especificado que es una modificación de un programa que ya tengo hecho con BDE, aunque estoy estudiando y sigo con el tema de firebird, para el nuevo planteamiento de programa que ya tengo en marcha, pero no me atrevo a cambiar los que ya tengo funcionando...pido perdon por la confusión que he creado con mi despiste de novato, aunque tambien tengo que decir que me viene que ni pintado la idea de lepe que voy a poner en practica en firebird antes que decir ya....

Pero....lo cierto es que el codigo que he puesto esta en un Tquery en BDE y lo tengo que solucionar en este formato...

Amigo luisgutierrezb, no he hecho nunca dentro de un Tquery una vista y al mismo tiempo un select para esa vista, tengo mis dudas de que funcione, pero tengo que probarlo...si ocurre algo inesperado, algo como que funcione pues si que lo voy a decir, pero si no funciona el tema pues mejor me callo y no lio mas a la gente...pero muchas gracias...

En fin, sigo con el baston en este tunel oscuro....

Gracias.
Responder Con Cita
  #6  
Antiguo 03-12-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
En paradox no existen, propiamente hablando, las vistas, pero las imita. En tu caso tendrías que guardar el texto de tu consulta orignal en un archivo, digamos, cuentas.sql y poner en tu Query la consulta que indica luisgutierrezb:

Código SQL [-]
select cuenta, max(saldo)
from "cuentas.sql"
group by cuenta

// Saludos
Responder Con Cita
  #7  
Antiguo 04-12-2006
aladelta aladelta is offline
Miembro
 
Registrado: jul 2003
Posts: 70
Poder: 21
aladelta Va por buen camino
solucionado

Hola a todos;

No solamente me habeis iluminado el canimo, sino que me habeis cogido de la mano para sacarme del tunel.....Una vez mas me quito el sombrero para agradecer las ideas y la ayuda que dais....

Nunca hubiera imaginado que se puede guardar en un archivo de texto una consulta y que el bde se la trague, pues he mirado por muchos sitios algo que me diera alguna pista y no he encontrado nada ni siquiera parecido a esto roman...

lepe, por mucho que diga, no te imaginas lo que supone para mi tu propuesta, muchas gracias...

luisgutierrezb, muchas gracias...

Gracias a todos...
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
Select de un Union All?? Luana Tablas planas 1 17-04-2006 16:24:07
Problema conuna consulta select...not in (select ...) VRO Firebird e Interbase 2 11-08-2005 08:56:35
5 select de 5 tablas diferentes en un select solo sakuragi SQL 6 15-06-2005 18:57:06
Select anidado: Select from (select....) Malon SQL 2 14-10-2004 14:01:24
Select anidado ( Select from select ) Malon Firebird e Interbase 1 05-10-2004 04:14:38


La franja horaria es GMT +2. Ahora son las 07:27:54.


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