Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

DESAFIO: Consulta imposible

Estas en el tema de DESAFIO: Consulta imposible en el foro de Mysql en Foros del Web. Gente: solicito ayuda. Tenemos las siguientes tablas (sólo pondrè los campos que nos interesan) consultores: id, nombre visitas id_consultor, fecha, horas tarifas id_consultor, valor, fecha1, ...
  #1 (permalink)  
Antiguo 13/06/2008, 07:53
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
DESAFIO: Consulta imposible

Gente: solicito ayuda.
Tenemos las siguientes tablas (sólo pondrè los campos que nos interesan)

consultores:
id, nombre

visitas
id_consultor, fecha, horas

tarifas

id_consultor, valor, fecha1, fecha2


ahora bien. Cuando se hace una consulta para ver las horas de determinado consultor en todos los proyectos entre dos fechas, se ejecuta la consulta:

SELECT DATE_FORMAT(visitas.fecha, '%d-%m-%Y') AS fechaf, visitas.*,
proyectos.titulo, proyectos.cliente, consultores.nombre, clientes.nombre as nomcli
FROM visitas
inner join clientes on proyectos.cliente=clientes.id
inner join proyectos on proyectos.id=visitas.proyecto
inner join consultores on consultores.id=visitas.id_consultor
WHERE visitas.id_consultor='$consultor'
AND visitas.fecha between '$fecha1a' and '$fecha2a' group by visitas.id

Bien. Si el consultor sòlo tiene una tarifa cargada en su historial, los valores de tarifas serán:
id_consultor=1, valor=$50, fecha1=2008-01-01, fecha2=0000-00-00

el càlculo serìa el total de cantidad de horas de las visitas obtenidas como resultado en la consulta anterior, multiplicado por valor ($50).

Se podrìa hacer como:
SELECT sum(horas) as totalhoras FROM visitas where visitas.fecha between '$fecha1a' and '$fecha2a' and id_consultor='$consultor' order by $orden"

y ese resultado se multiplica por valor ($50) y listo.

Ahora, si en el historial de tarifas hubo varias, lo que tenemos es un registro así:
id_consultor=1, valor=$50, fecha1=2008-01-01, fecha2=2008-02-01
id_consultor=1, valor=$60, fecha1=2008-02-02, fecha2=2008-03-01
id_consultor=1, valor=$70, fecha1=2008-03-02, fecha2=0000-00-00

entonces, la consulta tendrìa que poder discriminar el período 1 (entre 2008-01-01 y 2008-02-01), cotejarlo con las fechas dadas para el càlculo ($fecha1a y $fecha2a), calcular la cantidad de horas en visitas de esa fecha, y multiplicarlo por el valor asignado en esa època.
luego lo mismo con el siguiente período, y asì sucesivamente....

Alguna idea de cómo hacerlo?????
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #2 (permalink)  
Antiguo 13/06/2008, 09:12
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: DESAFIO: Consulta imposible

A ver si es esto lo que buscas:

SELECT c.nombre, SUM(t.valor* v.horas) FROM consultores c INNER JOIN tarifas t ON c.id= t.id_consultor INNER JOIN visitas v ON v.id_consultor = t.id_consultor AND v.fecha BETWEEN fecha1 AND fecha2 GROUP BY t.id_consultor ORDER BY c.nombre

Te agrupa por nombre y suma el resultado de multiplicar el valor por el número de horas. La clave está en el INNER JOIN, en la unión entre tablas que se hace en el caso de tarifas y visitas condicionada no por una, sino por dos equivalencias: 1) entre id_consultor de ambas tablas y 2) que el campo fecha de visitas esté entre fecha1 y fecha2 de la tabla tarifas; luego sumas todo agrupando por id_consultor y ordenas por el nombre del consultor...: esta es la idea.

¡Ojo! las fecha1 y fecha2 no deben solaparse para tarifas del mismo id_consultor; si las solapas, tendrás un problema (duplicarás cifras). Además, las fechas de visita deben poder incluirse dentro de un rango de fechas de tarifa para ese consultor, con el fin de asignarle un solo valor, y siempre uno. Vigila eso, porque he visto que además pones una fecha final 0000-00-00. Seguramente sea un error, pero si quieres poner final de año, tendrás que escribir 2008-12-31

Suerte.

Última edición por jurena; 13/06/2008 a las 09:51 Razón: añadir aclaraciones
  #3 (permalink)  
Antiguo 13/06/2008, 13:26
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: DESAFIO: Consulta imposible

Jurena: muchas gracias. haré los intentos en un rato, y luego te cuento
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #4 (permalink)  
Antiguo 13/06/2008, 14:24
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: DESAFIO: Consulta imposible

Jurena:
Preparé la consulta con tres variables: dos fechas extremas, para que me tome los registros todos, y el id_consultor=2, que es un consultor que ha realizado visitas en fechas recientes.

Me queda así:

SELECT c.nombre, SUM(t.valor* v.horas) FROM consultores c INNER JOIN tarifas t ON c.id= t.id_consultor INNER JOIN visitas v ON v.id_consultor = t.id_consultor AND t.id_consultor=2 and v.fecha BETWEEN 2000-01-01 AND 2009-01-01 GROUP BY t.id_consultor ORDER BY c.nombre

no me da error, pero tampoco me devuelve ningùn resultado... alguna idea?
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #5 (permalink)  
Antiguo 13/06/2008, 14:33
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: DESAFIO: Consulta imposible

Se me ocurre que quizàs habrìa que hacer una consulta a la tabla tarifas:

primero chequear la tabla tarifas.
si el consultor tiene solo un registro (esto sería id=1, id_consultor=2, valor=$50, fecha1=2008-01-01, fecha2=0000-00-00, entonces la consulta sería sencilla: multiplicamos valor por las horas sumadas entre $fecha1 y $fecha2 de la consulta.

si tiene màs de un registro, se complica, como puse en el post original...

alguna idea de cómo seguir?
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #6 (permalink)  
Antiguo 13/06/2008, 15:00
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: DESAFIO: Consulta imposible

La consulta debes hacerla así:

SELECT c.nombre, SUM(t.valor* v.horas) AS total FROM consultores c INNER JOIN tarifas t ON c.id= t.id_consultor INNER JOIN visitas v ON v.id_consultor = t.id_consultor AND v.fecha BETWEEN fecha1 AND fecha2 WHERE t.id_consultor = 2 AND v.fecha BETWEEN '2008-05-01' AND '2008-06-30' GROUP BY t.id_consultor
  #7 (permalink)  
Antiguo 13/06/2008, 16:29
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: DESAFIO: Consulta imposible

Jure: la consulta me devuelve resultados sòlo en los casos en que en la tabla tarifas, el consultor tiene màs de un registro (para aquellos que tenìan un valor $ asignado y nunca fue modificado no funciona), pero igualmente, el resultado es erróneo (me da 925, cuando deberìa dar 5797.5: 115.95 horas por $50).
alguna idea?
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #8 (permalink)  
Antiguo 13/06/2008, 18:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: DESAFIO: Consulta imposible

Esto debería devolver una tabla con los subtotales de cada tarifa:

Código:
SELECT 
   id, 
   nombre, 
   fecha, 
   SUM(horas * valor) TOTAL, 
   fecha1, 
   IF(fecha2 = '0000-00-00 00:00:00', NOW(), fecha2) fecha2
FROM 
    (SELECT 
    id, nombre, fecha, horas
    FROM consultores INNER JOIN visitas USING(id_consultor)) T1 
    INNER JOIN tarifas  USING(id)
WHERE fecha BETWEEN fecha1 AND fecha2
GROUP BY fecha1;
y sin el GROUP BY debeía devolver el total:


Código:
SELECT 
   id, 
   nombre, 
   fecha, 
   SUM(horas * valor) TOTAL, 
   fecha1, 
   IF(fecha2 = '0000-00-00 00:00:00', NOW(), fecha2) fecha2
FROM 
    (SELECT 
    id, nombre, fecha, horas
    FROM consultores INNER JOIN visitas USING(id_consultor))  T1
    INNER JOIN tarifas  USING(id)
WHERE fecha BETWEEN fecha1 AND fecha2;
¿Me cuentas cómo te fue?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 14/06/2008, 00:05
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: DESAFIO: Consulta imposible

No entiendo lo que me dices cuando escribes que el valor es $
Imagino que valor se trata de un campo numérico (INT, FLOAT, DECIMAL), por lo que no entiendo $ sin número. Si $ es un error, una codificación del valor por defecto o alguna otra cosa, dínoslo. Si lo tienes como VARCHAR ese campo, podremos solucionarlo, pero mira y dínoslo.
Si 0000-00-00 es el valor por defecto de fecha y significa "hasta el día de hoy", la solución nos la ha propuesto gnzsoloyo y la podemos aplicar a la sintaxis que te he propuesto y creo que funciona:
SELECT c.nombre, SUM(t.valor* v.horas) AS total FROM consultores c INNER JOIN tarifas t ON c.id= t.id_consultor INNER JOIN visitas v ON v.id_consultor = t.id_consultor AND v.fecha BETWEEN fecha1 AND (IF(fecha2 = '0000-00-00', NOW(),fecha2)) WHERE t.id_consultor = 3 AND v.fecha BETWEEN '2008-01-01' AND '2008-06-30' GROUP BY t.id_consultor

Si $ significa precio por defecto 50 bastará con hacer los mismo con valor y deberías probar algo así (esto no lo he probado)
SELECT c.nombre, SUM(IF(t.valor=$, 50, t.valor)* v.horas) AS total FROM consultores c INNER JOIN tarifas t ON c.id= t.id_consultor INNER JOIN visitas v ON v.id_consultor = t.id_consultor AND v.fecha BETWEEN fecha1 AND (IF(fecha2 = '0000-00-00', NOW(),fecha2)) WHERE t.id_consultor = 3 AND v.fecha BETWEEN '2008-01-01' AND '2008-06-30' GROUP BY t.id_consultor

Explícanos un poco los valores por defecto de los campos fecha2 y valor..., pero antes dinos el tipo de campo, que imagino que debería ser numérico en el caso de valor, y cómo introduces el dato. Por ej. si es que estás usando para valor un varchar y escribes $45 cuando quieres que el valor sea 45.

Y danos también los datos concretos que te fallan: por ej., el id_consultor x tiene las tarifas con los datos siguientes y las siguientes visitas; si busco sus totales de tal a tal fecha, me da error. Pero todo ello con datos concretos, porque a mí me está funcionando bien la consulta que te propuse por el momento. Tal vez sea un problema del tipo de datos, pero eso se solucionará fácilmente. No descarto que algo vaya mal en la consulta, pero necesitamos ponerla a prueba con datos concretos.

Última edición por jurena; 14/06/2008 a las 00:34
  #10 (permalink)  
Antiguo 14/06/2008, 05:09
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: DESAFIO: Consulta imposible

Una nota sobre la forma determinar las tarifas vigentes, es que tal y como has planteado los datos, el almacenamiento de las diferentes tarifas tiene una falla conceptual que puede producir errores:
- Si una tarifa está vigente, por ejemplo, entre el 25/05/2007 y el 30/03/2008, la vigencia de la siguiente tarifa debería ser a partir del día inmediato posterior al último de la anterior. Por un lado, esa es la costumbre comercial: las tarifas tienen vigencia entre un día X1 y un día X1+1, sin considerar horas, por otro lado si no lo haces de ese modo, toda facturación en las fechas límites se vuelve ambigua, porque ¿a qué tarifa corresponde?
- El segundo detalle es que no puedes usar en una tabla para consultas de cálculo un valor que sea nulo. porque hace nulo cualquier cálculo. Una fecha '0000-00-00 00:00:00' simplemente no existe, y hay que considerarlo en la consulta.
Es posible que los errores de cálculo se deban a estas situaciones.
Una sugerencia que te puedo hacer es que realices las consultas en forma secuenciada, para verificar si las diferentes partes y niveles están juntando los datos que realmente esperas.
Eso es lo que hago cuando tengo consultas complejas: voy ejecutando las subconsultas como capas de una cebolla, agregandole complejidad de a una tabla por vez y de a una subconsulta por vuelta. De esa forma puedes determinar en qué punto lo que obtienes se aleja de lo que quieres.
Incluso, en ocasiones, realizar dos subconsultas con INNER JOIN unidas por otro INNER JOIN puede resultar mucho más rápida, que hacer los cuatro a la vez en una sola subconsulta.
Si no lo estás usando, bájate la GUI de MySQL (Query Browser) y pruébalo allí. Es bastante eficiente para ese nivel de desarrollo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 16/06/2008, 13:29
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: DESAFIO: Consulta imposible

Responderé yo, gnzsoloyo:

he probado la sintaxis que propones, haciendo algunos cambios en los nombres de los campos para acomodarlos a los usados por Arielcasanova. Esta es la sintaxis que utilicé:

SELECT
T1.id,
T1.nombre,
SUM(T1.horas * t.valor) TOTAL
FROM (SELECT
c.id as id, c.nombre as nombre, v.fecha as fecha, v.horas as horas
FROM consultores c INNER JOIN visitas v ON v.id_consultor= c.id) T1 INNER JOIN tarifas t ON t.id_consultor = T1.id WHERE T1.fecha BETWEEN t.fecha1 AND IF(t.fecha2 = '0000-00-00', NOW(),t.fecha2) GROUP BY t.id_consultor

Funciona, y funciona bien, y además lo hace más rápido que mi propuesta con varios inner join. Tenías razón.
Estoy también de acuerdo contigo sobre lo del solapamiento y respecto al uso de 0000-00-00 como por defecto, pues equivale a nulo. Tal vez otro valor por defecto que equivaliera a "hasta el día de hoy" causaría menos problemas.

Gracias.

Última edición por jurena; 17/06/2008 a las 02:40
  #12 (permalink)  
Antiguo 18/06/2008, 13:04
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: DESAFIO: Consulta imposible

gnzsoloyo, jurena, primero muchísimas gracias por intentar ayudarme y segundo, disculpen la ausencia, estuve de viaje!
Con respecto a las dos consultas que propone gnzsoloyo, me arrojan un "ambiguous" respecto del campo id, y la verdad es que yo tambièn estoy un poco perplejo con la consulta en general, no sé al id de cuál de las tablas se hace la llamada.
con respecto al símbolo $, sí, fue un error mío. En realidad ahí va un INT, son $ 50 o $ 40, etc., es siempre dinero, por eso puse el $, pero el valor en la db es 50 o 40, etc.
Con respecto a las fechas, vienen de una variable en un formulario: el usuario del sistema realiza la consulta por un consultor o por todos (o sea, id_consultor=2, o id_consultor=4, o id_consultor=%) y entre dos fechas, que por defecto figura el año 2000-01-01 como fecha uno y la fecha del día como fecha 2, para devolver todos los registros.

Con respecto a lo que me dicen de las fechas y los valores, sí, en realidad lo contemplé así:
cuando se carga a un consultor en el sistema, se le asigna un valor para sus horas.
entonces se genera un registro:
id=1, id_consultor=2, tarifa=50, fecha1=2008-06-01, fecha2=0000-00-00

cuando a este consultor se le modifica la tarifa, se hace un update tarifas, set fecha2=(Fecha de hoy menos un día), y una carga nueva:
id=2, id_consultor=2, tarifa=50, fecha1=2008-06-18, fecha2=0000-00-00

la última consulta que propone jurena funciona rapídisimo, y me devolvió un montòn de valores, voy a tener que chequearla con la calculadora, a ver si funcionó bien. El tema es que no sé cómo cargarle las variables. Quizás esa consulta, con algunas modificaciones, sea la definitiva respuesta a mi planteo.
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #13 (permalink)  
Antiguo 18/06/2008, 13:10
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: DESAFIO: Consulta imposible

Acabo de verificar, el cálculo es perfecto!
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #14 (permalink)  
Antiguo 18/06/2008, 13:22
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: DESAFIO: Consulta imposible

He intentado introducir las variables pero no hay caso... ¿en qué lugar irían?

Otra cosa: No conozco el GUI de MySQL (Query Browser). ¿Se puede descargar de algún lado? ¿Funciona en escritorio o tengo que setearlo en el server?

gracias
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #15 (permalink)  
Antiguo 18/06/2008, 13:37
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: DESAFIO: Consulta imposible

Jurena afinó la idea y logró una excelente consulta. Me alegro que al final haya resultado.
Las variables se pueden integrar tanto en la creación del string de la consulta, encadenandolas donde deben ir, recordando que las fechas deben ir entre apóstrofes lo mismo que los strings.
También pueden ser parametrizados como sentencias, dependiendo del lenguaje que se use para programar.
En cuanto a la GUI de MySQL, la interfase gráfica de usuario, es una aplicación que se descarga de la página oficial de MySQL: MySQL GUI Tools Downloads
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #16 (permalink)  
Antiguo 18/06/2008, 13:42
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: DESAFIO: Consulta imposible

Un par de cosas, Ariel:
1) la consulta no es la mía, es la de gnzsoloyo, adaptada por mí a los nombres de tus campos: realmente todo el mérito es suyo. La mía ofrece los mismos resultados, pero es mucho menos eficiente y rápida.
2) en este foro no nos admiten código de programación. ¿Por qué no pruebas con datos concretos y luego introduces las variables? Si tienes algún problema al adaptarlo, deberías dirigirte al foro del programa que usas. Pero primero ponnos un ejemplo con datos concretos, pruébalo y dinos si tienes algún problema. Si funciona, lo de las variables será secundario y fácil de solucionar, según creo.

Última edición por jurena; 18/06/2008 a las 14:50
  #17 (permalink)  
Antiguo 19/06/2008, 13:19
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: DESAFIO: Consulta imposible

Perdón por la confusión, entonces. Igualmente, el mérito es de ambos, que se toman la molestia en ayudarme.
Ok, para no romper las reglas del foro, digamos que quiero obtener los valores para el consultor cuyo id_consultor en la tabla visitas (o el id en la tabla consultores) es '2' y entre las fechas '2008-01-01' y '2008-06-17'.
En què lugar de la consulta tendría que poner estos datos?
probè de reemplazar algunos nombres de campos, y tambièn de incluir el "where fecha between... and id_consultor=..." pero no hubo caso, siempre me devuelve errores (ambiguous, valores nulos, etc.).
Sime ayudan con esto, ya tenemos el broche de oro en este post.

gnzsoloyo: gracias por la data del GUI, lo descargo ya mismo.
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #18 (permalink)  
Antiguo 19/06/2008, 13:58
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: DESAFIO: Consulta imposible

Prueba esto:
SELECT
T1.id,
T1.nombre,
SUM(T1.horas * t.valor) TOTAL
FROM (SELECT
c.id as id, c.nombre as nombre, v.fecha as fecha, v.horas as horas
FROM consultores c INNER JOIN visitas v ON v.id_consultor= c.id) T1 INNER JOIN tarifas t ON t.id_consultor = T1.id WHERE T1.fecha BETWEEN '2008-01-01' AND '2008-06-17' AND T1.fecha BETWEEN t.fecha1 AND IF(t.fecha2 = '0000-00-00', NOW(),t.fecha2) GROUP BY t.id_consultor HAVING T1.id = 2

No lo he comprobado todo.
  #19 (permalink)  
Antiguo 19/06/2008, 14:03
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: DESAFIO: Consulta imposible

Increíble: Funcionó. Bah, creíble, digo, uds. son unos capos y es creíble que funcione, pero a mí despuès de casi un mes de pelear sòlo contra esa consulta, me resulte increìble haber podido terminar con eso.
Muchas gracias, me han sido de mucha ayuda. Para servirlos en lo que pueda, quedo a v/ disposición.
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #20 (permalink)  
Antiguo 19/06/2008, 14:33
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: DESAFIO: Consulta imposible

Ya que estamos, otra consulta:

si quisiera poder aislar la cantidad horas para un determinado proyecto (p. ej, el 103) para un consultor (p. ej. el 2) entre dos fechas (las que ya pusimos)...

no me resulta.
he intentado


SELECT
T1.id,
T1.nombre,
T1.proy
SUM(T1.horas * t.valor) TOTAL
FROM (SELECT
c.id as id, c.nombre as nombre, v.fecha as fecha, v.horas as horas, v.proyecto as proy
FROM consultores c INNER JOIN visitas v ON v.id_consultor= c.id) T1 INNER JOIN tarifas t ON t.id_consultor = T1.id WHERE T1.fecha BETWEEN '2008-01-01' AND '2008-06-17' AND T1.fecha BETWEEN t.fecha1 AND IF(t.fecha2 = '0000-00-00', NOW(),t.fecha2) and T1.proy=103 GROUP BY t.id_consultor HAVING T1.id = 2


pero no me resulta, me tira un "check the manual ... for the right syntax to use near 'SUM(T1.horas * t.valor) TOTAL..." osea, como si la consulta estuviera mal desde arriba.
pruebo la consulta que está entre paréntesis y funciona bien, pero el conjunto no... ¿alguna pista?
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #21 (permalink)  
Antiguo 19/06/2008, 14:54
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: DESAFIO: Consulta imposible

Tu principal problema es que te falta una coma antes de SUM. Prueba y me dirás.

SELECT
T1.id,
T1.nombre,
T1.proyecto,
SUM(T1.horas * t.valor) TOTAL
FROM (SELECT
c.id as id, c.nombre as nombre, v.fecha as fecha, v.horas as horas, v.proyecto as proyecto
FROM consultores c INNER JOIN visitas v ON v.id_consultor= c.id) T1 INNER JOIN tarifas t ON t.id_consultor = T1.id WHERE T1.fecha BETWEEN '2008-01-01' AND '2008-06-17' AND T1.fecha BETWEEN t.fecha1 AND IF(t.fecha2 = '0000-00-00', NOW(),t.fecha2) and T1.proyecto = 103 GROUP BY t.id_consultor HAVING T1.id = 2
  #22 (permalink)  
Antiguo 19/06/2008, 15:01
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: DESAFIO: Consulta imposible

puedo ser tan estùpido? sí, puedo.
gracias!!!!!
-se resolvió con eso-
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #23 (permalink)  
Antiguo 21/08/2008, 13:14
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: DESAFIO: Consulta imposible

tuve que cambiar el tema de las fechas 00-00-0000, así que ahora todas las tarifas están de la siguiente manera (por ejemplo)

id: 1 - id_consultor:3 - valor: 50 - fecha1:2000-01-01 - fecha2:2010-01-01


Cuando quiero obtener el total de cantidad de horas y el importe que hay que pagarle al consultor, seleccionando todos los proyectos y un consultor determinado, obtengo resultados irreales.
la consulta es:

SELECT
T1.id,
T1.nombre,
T1.proyecto,
SUM(T1.horas * t.valor) TOTAL
FROM

(SELECT c.id as id, c.nombre as nombre, v.fecha as fecha, v.horas as horas, v.proyecto as proyecto
FROM consultores c
INNER JOIN visitas v
ON v.id_consultor= c.id) T1

INNER JOIN tarifas t
ON t.id_consultor = T1.id
WHERE T1.fecha BETWEEN 2000-01-01 and 2010-01-01
AND T1.fecha BETWEEN t.fecha1 AND IF(t.fecha2 = '0000-00-00', NOW(),t.fecha2) GROUP BY t.id_consultor
HAVING T1.id = 3


en donde creo que podría reemplazar

AND T1.fecha BETWEEN t.fecha1 AND IF(t.fecha2 = '0000-00-00', NOW(),t.fecha2)

por

AND T1.fecha BETWEEN t.fecha1 AND t.fecha2

dado que t.fecha2 ya nunca será 0000-00-00.


Por lo demás, tengo "SUM(T1.horas * t.valor) TOTAL", que me hace pensar que de la consulta T1 obtuve la cantidad de horas de todos los proyectos, realizados por este consultor, entre fecha y fecha, pero no sé cómo está discriminando los rangos de fecha en los que la tarifa del consultor cambia.

Jurena: si me entendiste algo y podés ayudarme, muy agradecido .
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar

Última edición por arielcasanova; 21/08/2008 a las 15:48 Razón: edito las variables
  #24 (permalink)  
Antiguo 21/08/2008, 14:53
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: DESAFIO: Consulta imposible

Ariel,

SELECT T1.id, T1.nombre, T1.proyecto, SUM( T1.horas * t.valor ) TOTAL
FROM (

SELECT c.id AS id, c.nombre AS nombre, v.fecha AS fecha, v.horas AS horas, v.proyecto AS proyecto
FROM consultores c
INNER JOIN visitas v ON v.id_consultor = c.id
)T1
INNER JOIN tarifas t ON t.id_consultor = T1.id
WHERE T1.fecha
BETWEEN '2008-01-01'
AND '2008-06-17'
AND T1.proyecto =103
GROUP BY t.id_consultor
HAVING T1.id =2

Esto me funciona. Ya sabes que no ponemos variables, de modo que donde pone la primera fecha, fecha1, y donde pone la segunda, fecha2.

En cuanto a lo otro que me dices, creo que la sintaxis de Gnzsoloyo lo resolvió bien. He hecho alguna comprobación, y parece funcionar. Haz tú algunas comprobaciones de datos concretos.

EDITO para decirte que si es que algo no funciona, debes darnos los datos concretos, y decirnos lo que sale y lo que debería salir...
  #25 (permalink)  
Antiguo 21/08/2008, 15:30
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: DESAFIO: Consulta imposible

disculpas! ahora justo estaba trabajando con otro proyecto; enseguida reviso y doy los errores exactos.
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #26 (permalink)  
Antiguo 21/08/2008, 15:59
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: DESAFIO: Consulta imposible

bueno.... estoy algo perplejo.
quería anotar datos concisos en el post, pero he descubierto que el error se produce sólo en dos consultores en particular, y no con el resto.
el tema es que estos dos consultores suman unas 600 horas cada uno en un montón de visitas (entre 2 y 6 horas cada visita) así que encontrar el error puede llevarme mucho tiempo.
El error es que me da un total de, por ejemplo, 602.5 horas, y un importe de $ 4.850.. cosa que es imposible, porque el consultor tiene asignada una tarifa de $ 50 para un período y de $ 70 para otro...
Por eso, mientras tanto busco el error, voy preguntando, ¿el hecho de que haya fracciones como 4.5 horas, puede alterar el resultado?
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #27 (permalink)  
Antiguo 22/08/2008, 01:51
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: DESAFIO: Consulta imposible

Podría estar ocurriendo lo que dices, si no has aplicado correctamente el tipo y tamaño float a horas. Dinos cómo has puesto el tamaño de ese float para horas, porque por ej. un tamaño 4,2 ó un 3,1 te causan el problema al convertir a 99,9 y 9,9 un número superior a 99,9 y a 9,9, respectivamente. Mira este hilo y lee el claro post de Genetix, donde se explica todo esto bien: http://www.forosdelweb.com/f86/probl...-mysql-208813/

Esta consulta (perdona en el post anterior eliminé erróneamente el and between fecha1 and fecha2 que debe estar incluido) me ha funcionado perfectamente con un total de horas de 602,5 entre dos visitas que tienen distinta tarifa de un mismo visitador y de distintos proyectos (una de 300 horas a 70 la hora, y otra de 302,5 horas a 50 la hora. Me ha salido un total de 36125. He quitado, además, la selección del proyecto, porque cuando suma varios te muestra el primero y puede ser equívoco.

SELECT T1.id, T1.nombre, SUM( T1.horas * t.valor ) TOTAL
FROM (

SELECT c.id AS id, c.nombre AS nombre, v.fecha AS fecha, v.horas AS horas, v.proyecto AS proyecto
FROM consultores c
INNER JOIN visitas v ON v.id_consultor = c.id
)T1
INNER JOIN tarifas t ON t.id_consultor = T1.id
WHERE T1.fecha
BETWEEN '2008-01-01'
AND '2008-12-31'
AND T1.fecha
BETWEEN t.fecha1
AND t.fecha2
GROUP BY t.id_consultor
HAVING T1.id =2

Creo que va a ser lo que dices. Comprueba el tamaño que has puesto a ese float para las horas.

Última edición por jurena; 22/08/2008 a las 04:21
  #28 (permalink)  
Antiguo 22/08/2008, 11:11
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: DESAFIO: Consulta imposible

voy a chequear lo de los float, pero te cuento una curiosidad: eliminé el registro en tarifas para ese consultor, y lo volví a cargar, y los cálculos dan perfecto.
antes de hacerlo, revisé bien, y el valor para el consultor era de $ 50 entre dos fechas determinadas, el número era "50", sin puntos, espacios, ni comas, cargado desde un script... como te decía, lo eliminé, y volví a cargarlo tal cual, con las mismas fechas, y ahora los cálculos funcionan.
de todos modos, voy a revisar esta parte de los float y te cuento
muchas gracias por tu ayuda
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:46.