Club Delphi  
    FTP   CCD     Enlaces   Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Desplegado
  #1  
Antiguo 25-11-2005
hmoner hmoner is offline
Miembro
 
Registrado: may 2005
Posts: 52
hmoner Va por buen camino
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...

Última edición por dec fecha: 25-11-2005 a las 02:11:09. Razón: ¡¡Encerrad el código fuente entre las etiquetas [SQL] ... [/SQL]!!
Responder Con Cita
  #2  
Antiguo 25-11-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Modelador
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.237
vtdeleon Va por buen camino
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
__________________
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
  #3  
Antiguo 29-11-2005
hmoner hmoner is offline
Miembro
 
Registrado: may 2005
Posts: 52
hmoner Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 29-11-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Modelador
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.237
vtdeleon Va por buen camino
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
__________________
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
  #5  
Antiguo 14-12-2005
FOURIER FOURIER is offline
Miembro
 
Registrado: dic 2005
Posts: 40
FOURIER Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 14-12-2005
hmoner hmoner is offline
Miembro
 
Registrado: may 2005
Posts: 52
hmoner Va por buen camino
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 !!!
Responder Con Cita
  #7  
Antiguo 14-12-2005
FOURIER FOURIER is offline
Miembro
 
Registrado: dic 2005
Posts: 40
FOURIER Va por buen camino
Aquí estare conectado

Ok yo aquí estaré conectado por si surge alguna duda
Responder Con Cita
  #8  
Antiguo 14-12-2005
hmoner hmoner is offline
Miembro
 
Registrado: may 2005
Posts: 52
hmoner Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 14-12-2005
FOURIER FOURIER is offline
Miembro
 
Registrado: dic 2005
Posts: 40
FOURIER Va por buen camino
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..
Responder Con Cita
  #10  
Antiguo 14-12-2005
FOURIER FOURIER is offline
Miembro
 
Registrado: dic 2005
Posts: 40
FOURIER Va por buen camino
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
Responder Con Cita
  #11  
Antiguo 14-12-2005
hmoner hmoner is offline
Miembro
 
Registrado: may 2005
Posts: 52
hmoner Va por buen camino
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
Responder Con Cita
  #12  
Antiguo 01-01-2006
hmoner hmoner is offline
Miembro
 
Registrado: may 2005
Posts: 52
hmoner Va por buen camino
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...
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 !!
Responder Con Cita
  #13  
Antiguo 24-05-2006
hmoner hmoner is offline
Miembro
 
Registrado: may 2005
Posts: 52
hmoner Va por buen camino
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
Responder Con Cita
Respuesta


Herramientas
Desplegado

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


La franja horaria es GMT +2. Ahora son las 12:14:19.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi