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 26-04-2014
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Hola compañeros, de momento tengo la siguiente consulta

Código Delphi [-]
SELECT
  CLIENTES.CODIGO,
  CLIENTES.NOMBRE,
  FACTURA.NUMERO,
  FACTURA.SERIE,
  FACTURA.FECHA,
  FACTURA.CODIGOAGENTE,
  EMPLEADOS.NOMBRE,
  FACTURA.TOTAL,
  FACTURA.COBRADA
FROM
 CLIENTES
 INNER JOIN FACTURA ON (CLIENTES.CODIGO=FACTURA.CODIGOCLIENTE)
 INNER JOIN EMPLEADOS ON (FACTURA.CODIGOAGENTE=EMPLEADOS.CODIGO)
WHERE
  (FACTURA.FECHA BETWEEN '04/01/2014' AND '04/30/2014')
ORDER BY
  CLIENTES.ID

Pero esta sólo me da los clientes que han comprado, en en esas fechas, y además me da un registro por cada factura, cuando lo que quiero, es que si el cliente no ha comprado, rellene el total con un 0 y además totalice todas las facturas en un sólo registro, sigo trabajando en ello, si voy consiguiendo algo más lo iré publicando
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #2  
Antiguo 26-04-2014
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
A ver abuelete ,
Para qué la consulta te devuelva los registros que no están en la otra tabla, tienes que utilizar LEFT JOIN en lugar de INNER JOIN. LEFT JOIN o rigth JOIN dependiendo del caso.

Para que además te agrupe por cliente, tendrás que agrupar los registros. Para ello utiliza GROUP BY , teniendo en cuenta que aquellos campos que no estén en el GROUP by deberán tener una función de agregado: sum, avrg , min., max .
Ahora bien, si añades al vendedor, te agrupara por cliente y vendedor, que me parece que no es lo que quieres.
Juega un poco con esto que te he dicho a ver si das con la solución. En caso negativo, ya te responderé más concretamente, pero es que ahora desde la tableta no puedo hacer pruebas.

Otra cosa que me gusta mucho a mi es sacar los meses en columnas, y una columna con el total.

Para eso una vez consigas la consulta, tienes que hacer algo así:
Select campos...
Sum(factura.total) as total,
Sum (case when month(factura.fecha)=1 then factura.total else 0 end ) as Enero,
...
Sum (case when month(factura.fecha)=12 then factura.total else 0 end ) as diciembre

From
Clientes
LEFT JOIN facturas on factura.idcliente =cliente.id
GROUP by campo1, ...

Espero que te sirva.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #3  
Antiguo 26-04-2014
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
A ver hijito
HE intentado, como me dices cambiando el

Código Delphi [-]
INNER JOIN FACTURA ON (CLIENTES.CODIGO=FACTURA.CODIGOCLIENTE)
por
Código Delphi [-]
LEFT JOIN FACTURA ON (CLIENTES.CODIGO=FACTURA.CODIGOCLIENTE)
o
Código Delphi [-]
RIGHT JOIN FACTURA ON (CLIENTES.CODIGO=FACTURA.CODIGOCLIENTE)

Pero sigue en las mismas, de hecho he quitado incluso la tabla empleados, para facilitarlo, el código esta como te pongo aquí

Código Delphi [-]
SELECT
  CLIENTES.CODIGO,
  CLIENTES.NOMBRE,
  FACTURA.NUMERO,
  FACTURA.SERIE,
  FACTURA.FECHA,
  FACTURA.CODIGOAGENTE,
  FACTURA.TOTAL,
  FACTURA.COBRADA
FROM
 CLIENTES
 RIGHT JOIN FACTURA ON (CLIENTES.CODIGO=FACTURA.CODIGOCLIENTE)
WHERE
  (FACTURA.FECHA BETWEEN '04/01/2014' AND '04/30/2014')
ORDER BY
  CLIENTES.ID

Pero sigue en las mismas ni aparecen los clientes que no han comprado, ya sabes tirarme de las orejas si estoy equivocado, voy a probar ahora lo de agruparlos y cuando puedas ya me indicaras si no te molesta.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #4  
Antiguo 26-04-2014
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Cita:
Empezado por fjcg02 Ver Mensaje
Otra cosa que me gusta mucho a mi es sacar los meses en columnas, y una columna con el total.

Para eso una vez consigas la consulta, tienes que hacer algo así:
Select campos...
Sum(factura.total) as total,
Sum (case when month(factura.fecha)=1 then factura.total else 0 end ) as Enero,
...
Sum (case when month(factura.fecha)=12 then factura.total else 0 end ) as diciembre

From
Clientes
LEFT JOIN facturas on factura.idcliente =cliente.id
GROUP by campo1, ...
Esto me parece muy interesante, cuando puedas sube el código y si puedes una imagen de ejemplo, como siempre gracias Javier.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #5  
Antiguo 26-04-2014
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Te comento, he intentado lo de los grupos y no funciona, el código lo he puesto como sigue

Código Delphi [-]
SELECT
  CLIENTES.ID,
  CLIENTES.CODIGO,
  CLIENTES.NOMBRE,
  FACTURA.NUMERO,
  FACTURA.SERIE,
  FACTURA.FECHA,
  FACTURA.CODIGOAGENTE,
  FACTURA.COBRADA,
  SUM(FACTURA.TOTAL) AS TOTALFINAL
FROM
 CLIENTES
 RIGHT OUTER JOIN FACTURA ON (CLIENTES.CODIGO=FACTURA.CODIGOCLIENTE)
WHERE
  (FACTURA.FECHA BETWEEN '04/01/2014' AND '04/30/2014')
GROUP BY
  CLIENTES.ID,
  CLIENTES.NOMBRE,
  FACTURA.NUMERO,
  FACTURA.SERIE,
  FACTURA.FECHA,
  FACTURA.CODIGOAGENTE,
  FACTURA.COBRADA,
  CLIENTES.CODIGO

y este es el resultado




Te he marcado en rojo, tanto el código que es el del cliente, puedes ver que en vez de haber un único registro hay varios y en los totales, la cantidad de cada factura
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #6  
Antiguo 26-04-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola José.
Cita:
Empezado por José Luis Garcí Ver Mensaje
...
Lo que quiero hacer es recorrer por orden de código todos los clientes, y que me diga el total de lo comprado entre unas determinadas fechas, poniéndome 0 en los que no hayan comprado nada, así de esta manera, se puede ver que clientes ya no compran o no se les ha visitado nuevamente.
...
Si solamente buscas obtener el código el nombre y el total comprado podes hacer:
Código SQL [-]
SELECT DISTINCT CL.CODIGO,
       CL.NOMBRE,
       COALESCE((SELECT SUM(TOTAL) FROM FACTURA WHERE CLIENTE_ID = CL.ID), 0) AS TOTALCOMPRADO
FROM CLIENTES CL, FACTURA FA
WHERE FA.FECHA BETWEEN :DESDE AND :HASTA
ORDER BY CL.CODIGO
Pero en esa consulta no es lógico pedir datos específicos de una factura tál como la fecha (FA.FECHA), ya que podrá haber distintas fechas en distintas facturas para el mismo cliente. Y además, no se correspondería con el sentido de la consulta que es obtener el total comprado por cada uno de los clientes entre dos fechas.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 26-04-2014 a las 18:34:52. Razón: ortografía
Responder Con Cita
  #7  
Antiguo 26-04-2014
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.913
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Para estos casos ayudaria mucho tener ejemplo de datos!

Y por ejemplo, usando:

http://sqlfiddle.com/
__________________
El malabarista.
Responder Con Cita
  #8  
Antiguo 26-04-2014
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Hola, no he podido responder antes,

No te salen los datos porque los clientes que no tienen facturas ( no reconcilian los registros ) no cumplen la condición que pones , es decir , al no tener facturas, su fecha factura es nula y no cumple la condición.

Si pusieras (factura.fecha between F1 and f2 or factura.fecha is null ) seguro que el resultado es diferente ( y más cercano a lo que quieres).

Para probar quita la condición de la fecha de la factura y ejecuta la consulta. Ya verás como aparecen registros con los datos de fras vacíos, son los que no tienen facturas. A partir de ahí ya te lo eh dicho casi todo...

A ver sí me puedo conectar a la noche desd el pc y puedo aportarte más información.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #9  
Antiguo 26-04-2014
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Gracias como siempre ecfisa, tienes razón a que sobra datos, pero como no tengo el CLIENTE_ID, lo he intentado modificar por

Código Delphi [-]
SELECT DISTINCT CL.CODIGO,
       CL.NOMBRE,
       COALESCE((SELECT SUM(TOTAL) FROM FACTURA WHERE FA.CODIGO   =  CL.CODIGO), 0) AS TOTALCOMPRADO
FROM CLIENTES CL, FACTURA FA
WHERE FA.FECHA BETWEEN ESDE AND :HASTA
ORDER BY CL.CODIGO

Pero me da el error

"Dinamyc SQL error SQL error code = -206 Ciumn unknown Fa.CODIGO At line 3 Column 58."
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #10  
Antiguo 26-04-2014
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Cita:
Empezado por mamcx Ver Mensaje
Para estos casos ayudaria mucho tener ejemplo de datos!

Y por ejemplo, usando:

http://sqlfiddle.com/
Te entiendo perfectamente, pero como son datos reales, no puedo facilitarlos, por cierto para que es el link que has puesto exactamente?.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
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
Servicios gratuitos para montar una empresa (WEB) MAXIUM La Taberna 9 05-11-2013 08:18:02
Solicito ayuda en cuestiones de montar un TPV José Luis Garcí Varios 10 14-03-2012 09:05:49
Seleccion multiple para montar query tgsistemas SQL 8 22-04-2010 18:48:19
Montar un apache para dominio publico, que necesito... alexander66 PHP 2 28-03-2007 00:52:33
Montar red para 2 PCs alfredosg19 Redes 5 17-07-2006 09:07:23


La franja horaria es GMT +2. Ahora son las 05:55:30.


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