Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Consulta dificil mysql (https://www.clubdelphi.com/foros/showthread.php?t=35161)

taru 02-09-2006 13:58:01

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.

Héctor Randolph 02-09-2006 16:28:09

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

Tony_G 02-09-2006 16:59:34

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.

taru 02-09-2006 19:33:49

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.

Tony_G 02-09-2006 22:25:46

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.

taru 02-09-2006 23:04:27

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

Héctor Randolph 03-09-2006 03:29:55

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


La franja horaria es GMT +2. Ahora son las 06:13:15.

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