Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-09-2006
Avatar de taru
taru taru is offline
Miembro
 
Registrado: jul 2006
Posts: 27
Poder: 0
taru Va por buen camino
Consulta dificil mysql

Estas son mis dos tablas:
______________________
|TABLA TICKET |
-------------------------
|id | ptotal |fecha|
-------------------------

_____________________
|TABLA INGRESOS |
------------------------
| id | idticket | ingreso |
-----------------------

ambas estan relaionadas, cade vez que se paga un ticket se crea un ingreso con el idticket del correspondiente ticket. El ticket puede quedar a medio pagar (en deuda).

por tanto puede que cada ticket tenga varios ingresos hasta quedar totalmente pagado.

Mi problema es la caja diaria. He creado este SELECT:
Código SQL [-]
SELECT  IF (sum(ingresos.ingreso) > ticket.ptotal, ticket.ptotal, sum(ingresos.ingreso)) as totalingresos
FROM ticket LEFT JOIN ingresos ON ticket.id = ingresos.idticket
WHERE DAY(ingresos.fecha)=hoy
GROUP BY ticket.id;
de manera que me seleccione el ptotal del ticket o la suma de los ingresos segun sea este (el ptotal) mayor que la suma de los otros o viceversa, es decir si la suma de los ingresos del dia es menor que el ptotal del ticket cojo la suma de los ingresos, y si es al contrario osea se ha pagado totalmente el ticket cojo el ptotal del ticket.

El problema es que lo hace bien y me da una tabla con una columna de sumas de ingresos o ptotales en su defecto. pero no se como sumar esta columna para que me de un solo resultado que seria los ingresos del dia.

totalingresos

30
30
23
12
34
56
---
185 tendria que conseguir como resultado

esta comprobado y esta bien, pero nose como sumar ahora esta columna de numeros
si le meto un sum antes del if me da un problema de error de group by

Gracias por adelantado.

Última edición por taru fecha: 02-09-2006 a las 14:22:37.
Responder Con Cita
  #2  
Antiguo 02-09-2006
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
No estoy seguro de que funcione pero podrías intentar crear una vista con tu sentencia:

Código SQL [-]
CREATE VIEW caja AS 
SELECT  IF (sum(ingresos.ingreso) > ticket.ptotal, ticket.ptotal, sum(ingresos.ingreso)) as totalingresos
FROM ticket LEFT JOIN ingresos ON ticket.id = ingresos.idticket
WHERE DAY(ingresos.fecha)=hoy
GROUP BY ticket.id;

Después puedes obtener el total sumando el campo como se esperaría:
Código SQL [-]
  SELECT SUM(totalingresos) FROM caja;

Espero que sea útil, saludos
Responder Con Cita
  #3  
Antiguo 02-09-2006
Tony_G Tony_G is offline
Miembro
 
Registrado: may 2003
Ubicación: Córdoba - España
Posts: 40
Poder: 0
Tony_G Va por buen camino
Si lo que quieres es calcular el total de pagos recibidos en una fecha (sin importar a qué tickets corresponden) yo haría la siguiente consulta:

Código:
select sum(ingresos.ingreso) as cajadeldia from ingresos where ingresos.fecha=diaacalcular;
Ya me dirás si te vale.

Saludos, Antonio.
__________________
TonyG
Responder Con Cita
  #4  
Antiguo 02-09-2006
Avatar de taru
taru taru is offline
Miembro
 
Registrado: jul 2006
Posts: 27
Poder: 0
taru Va por buen camino
Te comento Tony_G no puedo hacer eso ya que el ingreso es lo que entrega el cliente a la cajera aunque sea mas que el total del ticket entonces no seria real ya que esta tendria que dar cambio y no cuento con eso en la base de datos.

Gracias por contestar.

Héctor Randolph tengo una pregunta, la tabla que se crea que es temporal o quedaria para siempre?. Me refiero a
CREATE VIEW caja AS


Saludos y gracias.

Última edición por taru fecha: 02-09-2006 a las 19:36:33.
Responder Con Cita
  #5  
Antiguo 02-09-2006
Tony_G Tony_G is offline
Miembro
 
Registrado: may 2003
Ubicación: Córdoba - España
Posts: 40
Poder: 0
Tony_G Va por buen camino
Has probado añadiendo 'WITH ROLLUP' a tu consulta:

Código:
SELECT IF (sum(ingresos.ingreso) > ticket.ptotal, ticket.ptotal,
sum(ingresos.ingreso)) as totalingresos FROM ticket
LEFT JOIN ingresos ON ticket.id = ingresos.idticket WHERE
DAY(ingresos.fecha)=hoy GROUP BY ticket.id WITH ROLLUP;
De esta forma la consulta te devuelve el total en el último registro.

Espero que te sirva.

Saludos, Antonio.
__________________
TonyG
Responder Con Cita
  #6  
Antiguo 02-09-2006
Avatar de taru
taru taru is offline
Miembro
 
Registrado: jul 2006
Posts: 27
Poder: 0
taru Va por buen camino
Gracias Tony_G Pero no funciona te comento:
Código SQL [-]
SELECT IF (sum(ingresos.ingreso) > ticket.ptotal, ticket.ptotal, sum(ingresos.ingreso)) as totalingresos
FROM ticket LEFT JOIN ingresos ON ticket.id = ingresos.idticket
WHERE DAY(ingresos.fecha)=2
GROUP BY ticket.id  WITH ROLLUP;
y me da como resultado:
30
90
150
198
10
30

el rollup añade el 30 final
lo anterior al 30 esta todo correctamente incluso si hago el select de esta forma:
Código SQL [-]
SELECT ticket.id, IF (sum(ingresos.ingreso) > ticket.ptotal, ticket.ptotal, sum(ingresos.ingreso)) as totalingresos
FROM ticket LEFT JOIN ingresos ON ticket.id = ingresos.idticket
WHERE DAY(ingresos.fecha)=2
GROUP BY ticket.id  WITH ROLLUP;
veo el id de los ticket y el null final, De todas formas gracias por lo del roolup no lo conocia ya he visto tb el CUBE:
148, 30
150, 90
154, 150
158, 198
162, 10
, 30
Responder Con Cita
  #7  
Antiguo 03-09-2006
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Cita:
Empezado por taru
Héctor Randolph tengo una pregunta, la tabla que se crea que es temporal o quedaria para siempre?. Me refiero a
CREATE VIEW caja AS
Bueno en realidad se guarda la vista como parte de los metadatos, no se guarda una tabla, sólo se almacena la definición de la consulta que existirá en tiempo de ejecución.

Pero creo saber cuál es el problema y porque la pregunta.

Intenta de esta forma.

Código SQL [-]
CREATE VIEW caja AS 
SELECT ingresos.fecha,ticket.id, IF (sum(ingresos.ingreso) > ticket.ptotal, ticket.ptotal, sum(ingresos.ingreso)) as totalingresos
FROM ticket LEFT JOIN ingresos ON ticket.id = ingresos.idticket
GROUP BY ingresos.fecha,ticket.id

Código SQL [-]
  SELECT totalingresos FROM caja
  WHERE DAY(ingresos.fecha)=2

Código SQL [-]
  SELECT SUM(totalingresos) FROM caja
  WHERE DAY(ingresos.fecha)=2

Si quieres mostrar ambos resultados en una misma consulta puedes usar UNION ALL.

Saludos
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
Una consulta dificil noshy SQL 3 31-05-2006 20:50:58
Una consulta dificil noshy SQL 3 22-05-2006 18:22:06
Consulta Dificil Abel Garcia Firebird e Interbase 5 18-11-2005 19:40:50
Una consulta un poco dificil? danytorres SQL 1 24-10-2003 22:42:03
consulta a mysql jfontane PHP 2 10-06-2003 19:11:57


La franja horaria es GMT +2. Ahora son las 12:23: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
Copyright 1996-2007 Club Delphi