Código MySQL:
Ver original
| ||||
Se puede mejorar esta consulta. Con esta consulta no tengo problema me trae justo lo que quiero, pero no se hay forma de mejorar esto.
Código MySQL:
Ver original |
| |||
Respuesta: Se puede mejorar esta consulta. Hola arielenter: Creo que deberías comenzar por decirnos qué es lo que hace tu consulta, pues son sólo ver el código puede resultar muy difícil descifrarlo. Puedes postear la estructura de tu tabla y pones algunos datos de ejemplo para ver si existe otra alternativa para lograr obtener el mismo resultad. Por lo que puedo observar sólo consultas una tabla (alquiler) por lo que es posible que se pueda cambiar la consulta para que no tengas que hacer subconsultas. A reserva de que nos expliques la lógica de tu pregunta se me ocurre que puedes hacer algo como esto:
Código MySQL:
Ver original No estoy seguro siguiera si esto puede funcionar, es una consulta que lanzo vuelo, pero que no he podido probar. Sólo tengo que hacer una observación y es con las condiciones de tu primer select, te recuerdo que por jerarquía de operadores el AND se ejecuta primero que el OR, por lo tanto cuando tienes esto: fentrada BETWEEN '2001-01-01' AND '2011-08-04' AND estado='PAGADO' OR estado='OCUPADO' en palabras sería "todos los registros en que fentrada esté entre el rango de fechas Y que estado sea PAGADO + que el estado sea OCUPADO, sin importar que la fentrada no esté en el rango de fechas" Si quieres que las condiciones OR se ejecuten en el mismo orden (es decir que la condición del rango de fechas afecte a ambos estados) deberías escribir tu condición así:
Código:
o utilizando el operador INfentrada BETWEEN '2001-01-01' AND '2011-08-04' AND (estado='PAGADO' OR estado='OCUPADO')
Código:
Saludos y espero tus comentariosfentrada BETWEEN '2001-01-01' AND '2011-08-04' AND estado IN ('PAGADO', 'OCUPADO') Leo |
| ||||
Respuesta: Se puede mejorar esta consulta. Muchas gracias por responder gnzsoloyo, siempre cuando los haces, haces muy bien. Tengo una tabla que se llama alquiler con los siguientes campos En el campo estado yo defino 3 estado: estado=DEBE: Cuando un cliente ya salio del hotel pero queda debiendo pudo haber entregado algo o no tambien. estado=OCUPADO: Cuando un cliente esta todavía en el hotel y pudo haber ya entregado 1 parte por la pieza y puede que tenga también consunción. estado=PAGADO:Cuando un cliente ya salio del hotel pudo haber entregado solo una parte por la pieza, pudo haber tenido consunción. Con ese script lo que ago sumar de acuerdo al estado. |
| |||
Respuesta: Se puede mejorar esta consulta. Hola de nuevo arielenter: No me quedó claro si ya resolviste la consulta o sigues con problemas. La consulta que te propone el compañero gnzsoloyo es de hecho prácticamente la misma que te propuse yo: Mi propuesta:
Código:
La propuesta de gnzsoloyo:SELECT DISTINCT SUM(IF(fentrada BETWEEN '2001-01-01' AND '2011-08-04' AND estado='PAGADO' OR estado='OCUPADO', total, 0)) + SUM(IF(fentrada BETWEEN '2011-01-08' AND '2011-05-08' AND estado='OCUPADO', entrega, 0)) + SUM(IF(fentrada BETWEEN '2011-01-08' AND '2011-05-08' AND estado='DEBE', entrega, 0)) xTotal FROM alquiler
Código:
En mi caso no puse la condición de la fecha en el where externo porque en tu consulta de ejemplo estabas manejando dos rangos de fechas, no uno solo:SELECT (SUM(IF(estado='PAGADO' OR estado='OCUPADO', total, 0)) + SUM(IF(estado='OCUPADO', entrega, 0)) + SUM(IF(estado='DEBE', entrega, 0))) xTotal FROM alquiler WHERE fentrada BETWEEN '2001-01-01' AND '2011-08-04';
Código:
Tal y como lo pone gnzsoloyo el rango de fechas se aplicaría igual para los tres casos, no estoy seguro si esto es correcto. De cualquier manera si resolviste consulta me alegro mucho.fentrada BETWEEN '2001-01-01' AND '2011-08-04' (para el primer sum) y fentrada BETWEEN '2011-01-08' AND '2011-05-08' (para los dos sum restantes) Saludos Leo. |
| ||||
Respuesta: Se puede mejorar esta consulta. leonardo_josue y gnzsoloyo Estuve probando los ejemplos que me pasaron pero no me trae la suma exacta trae menos. Si sumamos el campo entrega solo tiene que traer 60.000 cuando estado sea DEBE ó OCUPADO. Ahora si es estado=PAGADO solo tiene que sumar el campo TOTAL Al ejecutar el script tiene dar como resultado: 133.000 |
| ||||
Respuesta: Se puede mejorar esta consulta. Mira, creo que debe haber un error de interpretación. Dados los datos que muestras en esa tabla, y las condiciones puestas en esa primera consulta, no existe forma en que la suma te de 133.000. Según lo que nos dices, la tabla contiene esto:
Código MySQL:
Si sumo el contenido de cada columna, daría: Ver original
Código MySQL:
Como podrás ver, no hay combinación de importes que de una cifra semejante a la que buscas.Ver original Pero para ser más preciso, veremos qué pasaría si hago las sumas de tu primera consulta de separadamente, para ver qué suma:
Código MySQL:
Como puedes apreciar, la primera consulta da un resultado, pero las siguientes dos dan NULL, porque en realidad no hay registros que cumplan las condiciones puestas (atención, lo único que hice fue tomar las subconsultas tal y como las escribiste).Ver original Ahora bien, si lo que deseas es verificar que entrega+consumicion+saldo es iguala total, podemos hacer así:
Código MySQL:
Ver original Si no es eso lo que quieres suma, será mejor que nos digas exactamente qué es lo que quieres calcular, y sobre la base de qué datos, porque no se comprende bien lo que buscas. Por otro lado, ten cuidado con las sumas que se realicen, porque ciertas operaciones aritméticas, por razonables que sean, pueden generar falsos resultados porque no se estén planteando correctamente. Hay muchos trucos y enigmas matemáticos que surgen de juegos de numeros (Cualquier duda, consultar el libro El hombre que calculaba, de Malba Tahan).
__________________ ¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente... "El problema es la interfase silla-teclado." (Gillermo Luque) Última edición por gnzsoloyo; 05/08/2011 a las 20:45 |
| ||||
Respuesta: Se puede mejorar esta consulta. gnzsoloyo y leonardo_josue es cierto esta perfecto script que me pasaron los 2 funcionan, yo mismo metí la pata les pase una fecha equivocada. como se darán cuenta ahí. WHERE fentrada BETWEEN '2001-01-01' AND '2011-08-05' AND estado='PAGADO' WHERE fentrada BETWEEN '2011-01-08' AND '2011-05-08' AND estado='OCUPADO' WHERE fentrada BETWEEN '2011-01-08' AND '2011-05-08' AND estado='DEBE'; Cambiando la primera fecha 2001-08-05 and 2011-08-05 el resultado trae perfecto. xTotal = 133.000 Gracias a todos por ayudar. me merezco un toki jejeje
__________________ www.enterpy.net |
Etiquetas: |