Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Unir 2 Consultas en una sola (https://www.clubdelphi.com/foros/showthread.php?t=27597)

hmoner 25-11-2005 02:56:31

Unir 2 Consultas en una sola
 
Hola Amigos
Tengo un problema, bien sucio, y debo hacerlo si o si
Tengo 2 consultas, las cuales debo unir en una sola.

Es un programita de promociones donde:
Cada promocion tiene sus clientes, las facturaciones que se le han hecho a cada uno, cuantos
puntos ha ganado con cada facturacion, etc. etc.

La consulta siguiente obtiene los datos del socio y reporta:
Monto facturado en promociones normales
Monto facturado en promociones especiales
Monto Total facturado
( Todo esto para una promocion especifica :IDPROMO )

Código SQL [-]
  SELECT CLIENTE.NROSOCIO AS SOCIO, CLIENTE.NOMBRE AS CLIENTE, 
  CLIENTE.APELLIDO AS APELLIDO, CLIENTE.ESTABLECIMIENTO AS ESTABLECIMIENTO,
  SUM(case when espromoesp=true then 0 else FACTURACION.MONTO end) AS M_NORMAL,
  SUM(case when espromoesp=true then FACTURACION.MONTO else 0 end) AS M_ESPECIAL,
  SUM(FACTURACION.MONTO) AS TOT_MONTO
  FROM CLIENTE LEFT JOIN FACTURACION ON FACTURACION.IDCLIENTE=CLIENTE.ID
  where cliente.idpromo = :IDPROMO
  GROUP BY CLIENTE.NOMBRE,CLIENTE.APELLIDO,CLIENTE.ESTABLECIMIENTO,SOCIO
  ORDER BY CLIENTE.APELLIDO ASC, CLIENTE.ESTABLECIMIENTO ASC
Esta otra consulta reporta:
Total de puntos ganados ( en facturaciones normales y especiales )
Total de puntos que el cliente ha canjeado
Total de puntos que tiene en la actualidad ( totalganados - canjeados )
( Todo esto para una promocion especifica :IDPROMO )

Código SQL [-]
  SELECT CLIENTE.ID AS COD, 0 AS CANJEADOS, SUM(FACTURACION.PUNTOS) AS TOTALPUNTOS
  INTO #TEMP FROM
  CLIENTE JOIN FACTURACION ON CLIENTE.ID = FACTURACION.IDCLIENTE
  WHERE CLIENTE.IDPROMO = PIDPROMO
  GROUP BY COD, CANJEADOS;
  UPDATE #TEMP SET CANJEADOS =
  (SELECT SUM(B.TOTALPUNTOS) FROM CANJE B WHERE B.IDCLIENTE = #TEMP.COD);
  SELECT B.NROSOCIO, B.NOMBRE, B.APELLIDO, B.ESTABLECIMIENTO, 
  TOTALPUNTOS, CANJEADOS, (TOTALPUNTOS - CANJEADOS) AS PUNTOSACTUALES
  FROM #TEMP A
  LEFT OUTER JOIN CLIENTE B ON A.COD = B.ID
  ORDER BY APELLIDO,NOMBRE,ESTABLECIMIENTO ASC
Lo que debo hacer es: mostrar los datos del cliente: nombre apellido y establecimiento y luego
monto total facturado
monto normal
monto especial
puntos ganados
puntos canjeados
puntos actuales

Solo eso... juntar los 2 informes en uno solo :(

Algun alma caritativa que quiera ayudarme con este problemon ?

Desde ya muchas gracias...:(

vtdeleon 25-11-2005 03:05:37

Saludos

No he leido todo tu mensaje pero por el titulo que has dado te dire que chequees este hilo:
http://www.clubdelphi.com/foros/showthread.php?t=27421

hmoner 29-11-2005 18:50:55

hola Van Troi...
Gracias por responder...

No se si tu consejo ira a funcionar, ya que tengo PUNTOSGANADOS, PUNTOSCANJEADOS, PUNTOSACTUALES en una de las consultas y MONTOFACTURADONORMAL, MONTOFACTURADOESPECIAL, MONTOTOTAL en otra de las consultas, es decir:
Cada una de las consultas usa 3 campos distintos... y lo comun a cada una seria el nombre y los datos de la persona...

Funcionara igual o la Union debe recibir = cantidad de campos con igual nombre de campos ?

Gracias

vtdeleon 29-11-2005 21:08:41

Cita:

Empezado por hmoner
Funcionara igual o la Union debe recibir = cantidad de campo
con igual nombre de campos ?

Lo unico importante es tener el mismo orden en los campos

FOURIER 14-12-2005 03:01:50

Espero que te ayude
 
SELECT CLIENTE.NROSOCIO AS SOCIO, CLIENTE.NOMBRE AS CLIENTE, CLIENTE.APELLIDO AS APELLIDO, CLIENTE.ESTABLECIMIENTO AS ESTABLECIMIENTO, (select SUM(case when espromoesp=true then 0 else FACTURACION.MONTO end) from Facturacion as F where Facturacion.idcliente=cliente.id) AS M_NORMAL, (select SUM(case when espromoesp=true then FACTURACION.MONTO else 0 end) from facturacion as F where Facturacion.idcliente=cliente.id) AS M_ESPECIAL, (select SUM(FACTURACION.MONTO) from Facturacion as where Facturacion.idcliente=cliente.id) AS TOT_MONTO, (select sum(facturacion.puntos) from Facturacion where idcliente=cliente.id) as Totalpuntos,(SELECT SUM(B.TOTALPUNTOS) FROM CANJE B WHERE B.IDCLIENTE = cliente.id) as canjea,totalpuntos-canjea as puntos_actuales FROM CLIENTE where cliente.idpromo = :IDPROMO ORDER BY CLIENTE.APELLIDO ASC, CLIENTE.ESTABLECIMIENTO ASC


en fin espero que eso te ayude mi estimado

hmoner 14-12-2005 03:05:42

FOURIER !!
Mil gracias por tu aporte... no sabes cuan feliz estoy de recibir una respuesta en este hilo...

Voy a probarlo enseguida y luego te comento como me fue con la consulta...

Gracias !!! :D

FOURIER 14-12-2005 03:07:25

Aquí estare conectado
 
Ok yo aquí estaré conectado por si surge alguna duda

hmoner 14-12-2005 03:31:06

hola FOURIER nuevamente
Aqui he ordenado un poquitin la consulta... la he ingresado, pero me ha dado error en la linea 10, posicion 1...

Aqui la imagen del error, con el mensaje... como que no conoce alguna sentencia... :(

http://img231.imageshack.us/img231/5...userror3xp.jpg

Código SQL [-]
SELECT CLIENTE.NROSOCIO AS SOCIO, CLIENTE.NOMBRE AS CLIENTE, CLIENTE.APELLIDO AS APELLIDO, CLIENTE.ESTABLECIMIENTO AS ESTABLECIMIENTO, 
 (select SUM(case when espromoesp=true then 0 else FACTURACION.MONTO end) 
 from Facturacion as F 
 where Facturacion.idcliente=cliente.id) AS M_NORMAL, 
 (select SUM(case when espromoesp=true then FACTURACION.MONTO else 0 end) 
 from facturacion as F 
 where Facturacion.idcliente=cliente.id) AS M_ESPECIAL, 
 (select SUM(FACTURACION.MONTO) 
 from Facturacion as 
 where Facturacion.idcliente=cliente.id) AS TOT_MONTO, 
 (select sum(facturacion.puntos) 
 from Facturacion 
 where idcliente=cliente.id) as Totalpuntos,(SELECT SUM(B.TOTALPUNTOS) 
 FROM CANJE B WHERE B.IDCLIENTE = cliente.id) as canjea,totalpuntos-canjea as puntos_actuales 
 FROM CLIENTE where cliente.idpromo = 2
 ORDER BY CLIENTE.APELLIDO ASC, CLIENTE.ESTABLECIMIENTO ASC

Me pregunto como podria hacer para enviarte las estructura de las tablas para que puedas probar, ya que yo uso el motor NEXUS... www.nexusdb.com

Si quieres, armo las tablas en mySQL o en algun formato que digas y te las envio... (no se si con registros de ejemplo, ya que nexus no posee ninguna utilidad para exportar o convertir las tablas, ni registros)

Muchas gracias por tu ayuda

FOURIER 14-12-2005 04:13:15

Ok mi mail
 
mi correo es originalfourier@hotmail.com,, si quieres agregame a tu msn y nos transferimos los archivos... si quieres pasa las tablas a access para hacer una miniprueba..

FOURIER 14-12-2005 04:19:11

ya vi que falta
 
ya vi a esa parte le falta el nombre de alias a facturación... checate que donde dice select sum(facturacion.monto) from facturacion as where
esta vacia falta el alias, ponle cualquier cosa después del as

hmoner 14-12-2005 05:20:19

Bueno bueno...
Faltan palabras de agradecimiento para FOURIER, quien tan amablemente se ha ofrecido a ayudarme con mi problema, a traves del MSN Messenger, y se ha quedado hasta que finalmente pude hacer funcionar y unificar la consulta.
Hoy, he tenido muchisima suerte... gracias FOURIER.
Aqui la consulta terminada, por si a alguien le sirve...

Compatible con NEXUS ( motor de base de datos 3rdparty para Delphi - www.nexusdb.com )

Código SQL [-]
 SELECT CLIENTE.NROSOCIO AS SOCIO, CLIENTE.NOMBRE AS CLIENTE, CLIENTE.APELLIDO AS APELLIDO, CLIENTE.ESTABLECIMIENTO AS ESTABLECIMIENTO, 
 (select SUM(case when espromoesp=true then 0 else F.MONTO end) 
 from Facturacion as F 
 where F.idcliente = cliente.id) AS M_NORMAL, 
 (select SUM(case when espromoesp=true then F.MONTO else 0 end) 
 from facturacion as F 
 where F.idcliente = cliente.id) AS M_ESPECIAL, 
 (select SUM(FAC.MONTO) 
 from Facturacion as FAC
 where FAC.idcliente=cliente.id) AS TOT_MONTO, 
 (select sum(facturacion.puntos) 
 from Facturacion 
 where idcliente=cliente.id) as totalpuntosganados, (SELECT SUM(B.TOTALPUNTOS) 
 FROM CANJE B WHERE B.IDCLIENTE = cliente.id) as totalpuntoscanjeados, (select sum(facturacion.puntos) 
 from Facturacion 
 where idcliente=cliente.id) - (SELECT SUM(B.TOTALPUNTOS) 
 FROM CANJE B WHERE B.IDCLIENTE = cliente.id) as puntos_actuales 
 FROM CLIENTE where cliente.idpromo = :PIDPROMO
 ORDER BY CLIENTE.APELLIDO ASC, CLIENTE.ESTABLECIMIENTO ASC

hmoner 01-01-2006 23:42:57

Limitar por fechas la consulta anterior
 
Hola FOURIER nuevamente
Aqui inaugurando el 2006 con otro problemin basado en la misma consulta ;)
Ruego que todavia no hayas empezado tus vacaciones y tengas unos segundos para ayudarme a resolver esto:

Me han pedido poner un filtro por fechas en la consulta anterior, es decir, limitar todos los resultados totales de la consulta por fechas.
Ambas tablas, facturacion y canjes poseen un campo FECHA, pero he ingresado el codigo para limitar por fechas en cada uno de los WHERE, sin exito...:mad:
Código SQL [-]
AND Fac.FECHA > '15/10/2005'
o
AND F.Fecha > '15/10/2005'
Lo que si tengo dudas es en la logica de este problema, ya que las facturaciones no poseen la misma fecha que los canjes, por eso es la duda que tengo de que funcione...

Gracias, y buen 2006 !! :D

hmoner 24-05-2006 07:20:42

Hola amigos nuevamente
Al final pude solucionar el problema, con la siguiente consulta:

Código:

SELECT CLIENTE.NROSOCIO AS SOCIO, CLIENTE.NOMBRE AS CLIENTE, CLIENTE.APELLIDO AS APELLIDO, CLIENTE.ESTABLECIMIENTO AS ESTABLECIMIENTO,
(select SUM(case when espromoesp=true then 0 else F.MONTO end)
from Facturacion as F
where F.idcliente = cliente.id) AS M_NORMAL,
(select SUM(case when espromoesp=true then F.MONTO else 0 end)
from facturacion as F
where F.idcliente = cliente.id) AS M_ESPECIAL,
(select SUM(FAC.MONTO)
from Facturacion as FAC
where FAC.idcliente=cliente.id) AS TOT_MONTO,
(select sum(facturacion.puntos)
from Facturacion
where idcliente=cliente.id) as totalpuntosganados, (SELECT SUM(B.TOTALPUNTOS)
FROM CANJE B WHERE B.IDCLIENTE = cliente.id) as totalpuntoscanjeados, (select sum(facturacion.puntos)
from Facturacion
where idcliente=cliente.id) - (SELECT SUM(B.TOTALPUNTOS)
FROM CANJE B WHERE B.IDCLIENTE = cliente.id) as puntos_actuales
FROM CLIENTE where cliente.idpromo = 10
ORDER BY CLIENTE.APELLIDO ASC, CLIENTE.ESTABLECIMIENTO ASC

Y ahora tengo una pequeñita duda...
Si deseo filtrar este informe por FECHAS, donde debo poner dicho filtro ?

NOTA: FACTURACION.FECHA es el campo a filtrar... y por lo que veran, la tabla facturacion se usa como en 4 o 5 secciones de esta consulta...

He probado poner el filtro en cada lugar donde se usa la tabla facturacion pero no he tenido exito, me sale todo en blanco (no da error la consulta)

Desde ya muchas gracias :D


La franja horaria es GMT +2. Ahora son las 12:47:43.

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