Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   union de select (https://www.clubdelphi.com/foros/showthread.php?t=38097)

aladelta 02-12-2006 13:53:50

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....

Lepe 02-12-2006 15:03:09

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 :D :D

Saludos ;)

vtdeleon 02-12-2006 15:21:52

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:D.

Saludos

luisgutierrezb 02-12-2006 16:49:04

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

aladelta 02-12-2006 20:10:05

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.

roman 03-12-2006 01:56:48

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

aladelta 04-12-2006 10:17:47

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...


La franja horaria es GMT +2. Ahora son las 20:06:44.

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