Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Unir dos consultas SQL (https://www.clubdelphi.com/foros/showthread.php?t=93456)

Yulexis 03-10-2018 21:50:47

Unir dos consultas SQL
 
Un saludo para todos. Necesito un poco de ayuda con el siguiente problema:
Tengo las siguientes consultas las cuales funcionan correctamente.


Código SQL [-]
SELECT Sum(Importe) AS Importe_Total_CUP
  FROM Facturas as f_CUP
  WHERE (f_CUP.Tipo_de_Moneda='CUP')
Código SQL [-]
SELECT Sum(Importe) AS Importe_Total_CUC
  FROM Facturas as f_CUC
  WHERE (f_CUC.Tipo_de_Moneda='CUC')

El problema es que para ejecutarlas utilizo dos ADOQuery, con todo lo que conlleva (más recursos).
¿Exitiría la posibilidad de ejecutar las dos consulta en una?
Encontré en la red algo como esto, lo cambié y no funciona.
Código SQL [-]
SELECT
         SUM(CASE WHEN Tipo_de_Moneda = 'CUP' THEN Importe ELSE 0 END) total_cup ,
         SUM(CASE WHEN Tipo_de_Moneda = 'CUC' THEN Importe ELSE 0 END) total_CUC,
  FROM Facturas
Si alguien sabe cómo solucionar esto…
Uso XE8

orodriguezca 03-10-2018 22:27:47

Código SQL [-]
SELECT
         SUM(CASE WHEN Tipo_de_Moneda = 'CUP' THEN Importe ELSE 0 END) total_cup ,
         SUM(CASE WHEN Tipo_de_Moneda = 'CUC' THEN Importe ELSE 0 END) total_CUC,
  FROM Facturas

:( Esto se ve correcto, debería funcionar.

Cuando dices que no funciona a que te refieres?, Algún mensaje de error?, no da la respuesta esperada?.

A propósito, ¿Que motor de Bases de Datos estás utilizando?

Yulexis 03-10-2018 22:39:06

Cuando la ejecuto me dice que la palabra clabe WHEN no es reconocida.
Estoy utilizando ACCESS

mamcx 03-10-2018 23:52:51

Cita:

Empezado por Yulexis (Mensaje 528780)
Cuando la ejecuto me dice que la palabra clabe WHEN no es reconocida.
Estoy utilizando ACCESS

Access es un motor rdbms muy pobre, asi que no soporta esa forma de hacerlo. La unica es que hagas un UNION ALL:

Código SQL [-]
SELECT ...
  FROM Facturas as f_CUP
  WHERE (f_CUP.Tipo_de_Moneda='CUP')
UNION ALL
SELECT ...
  FROM Facturas as f_CUP

o con un case dentro del SUM

Yulexis 04-10-2018 00:13:42

Les explico mejor.

Tengo la siguiente tabla en ACCESS:

Fecha | Importe | Entidad | Estado | Tipo_de_Moneda
1/2/2018 14.5 Cualquiera pagada CUC
2/2/2018 6.30 Otra pagada CUP
3/2/2018 8 Otra pagada CUC
4/2/2018 4 Otra pagada CUP

Lo que necesito es en una consulta obtener los siguientes datos:
Importe_CUP = 10.3
Importe_CUC = 22.5

Ya he intentado de todo pero nada.
Con las consultas del inicio funciona pero solo con un ADOQuery para cada una.

Neftali [Germán.Estévez] 04-10-2018 10:06:05

Si utilizas un ADOQuery con la siguiente SQL deberían salir los datos que necesitas:

Código SQL [-]
Select TipoMoneda, SUM(Importe) from Tabla4 GROUP bY TipoMoneda


Código:

TipoMoneda  Importe
-----------------------
CUC              22,50
CUP              10,30


Neftali [Germán.Estévez] 04-10-2018 10:31:26

Aunque no es lo que necesitas exactamente sí contesta a una cuestión que has planteado al principio.
Utilizando un único TADOquery SI hay la posibilidad de ejecutar varias consultas independientes y acceder a los resultados.

Es decir, podemos añadir a la propiedad SQL algo como esto:

Código SQL [-]
select * from TABLA1;
select * from TABLA2;
select * from TABLA3;

Y podemos recuperar los Datos en tres Recordset diferentes.

Si utilizamos en siguiente código:

Código Delphi [-]
var
  rs:_Recordset;
  i:OleVariant;
begin
  query.Close;
  query.Open;

  rs := query.Recordset;
  Memo1.Lines.Add('--------------------------');
  while Assigned(rs) do begin
    while (not rs.EOF) do begin
      Memo1.Lines.Add(rs.Fields[0].Value);
      rs.MoveNext;
    end;
    rs := query.Recordset.NextRecordset(i);
    Memo1.Lines.Add('--------------------------');
  end;

Podemos obtener todos los recordset de la query (las 3 tablas) y todos los registros de cada recordset (tabla)
Y el resultado en pantalla sería algo así:


Código:

--------------------------
Campo1 AAAAAA Tabla1
Campo1 BBBBBB Tabla1
--------------------------
Campo1 CCCCCC Tabla2   
Campo1 DDDDDD Tabla2
--------------------------
Campo1 EEEEEE Tabla3   
Campo1 FFFFFF Tabla3
--------------------------


Yulexis 04-10-2018 15:18:54

[Resuelto]
 
Gracias mamcx y Neftali(La segunda ves que me ayudas hermano)


Resolví el problema con la siguiente SQL la cual armé luego de leer de que dentro de una llamada SQL se puede implementar un If...Then:


Código SQL [-]
SELECT
    Sum(iif(fact.Tipo_de_Moneda='CUP',fact.Importe, 0)) AS Importe_Total_CUP,
    Sum(iif(fact.Tipo_de_Moneda='CUC',fact.Importe, 0)) AS Importe_Total_CUC,
    Sum(iif(fact.Tipo_de_Moneda='CUP' AND fact.Estado='Facturada',fact.Importe, 0)) AS Importe_Sin_Pagar_CUP,
    Sum(iif(fact.Tipo_de_Moneda='CUC' AND fact.Estado='Facturada',fact.Importe, 0)) AS Importe_Sin_Pagar_CUC,
    Sum(iif(fact.Tipo_de_Moneda='CUP' AND fact.Estado='Pagada',fact.Importe, 0)) AS Importe_Pagado_CUP,
    Sum(iif(fact.Tipo_de_Moneda='CUC' AND fact.Estado='Pagada',fact.Importe, 0)) AS Importe_Pagado_CUC
FROM Facturas as fact

Esto me funciona perfectamente, se vinculan cada uno de los campos de la consulta con sus respectivas Label y listo (los muestro pero puedo hacer cualquier cosa con ellos).



Espero me den su opinión de si es o no una forma eficiente de realizarlo. Cómo será el consumo de recurso cuando tenga una gran cantidad de registros?

Yulexis 04-10-2018 15:46:55

1 Archivos Adjunto(s)
Así me ha quedado. En colores los datos que obtengo con la SQL.


La franja horaria es GMT +2. Ahora son las 07:06:37.

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