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

Consulta SQL no

Estas en el tema de Consulta SQL no en el foro de Mysql en Foros del Web. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT SUM ( LCANTI ) , LFECPED FROM   `fcloc001` WHERE LCODAR =   "Q2612A-R" AND LPED > 0 ...
  #1 (permalink)  
Antiguo 23/03/2016, 04:39
 
Fecha de Ingreso: julio-2015
Mensajes: 25
Antigüedad: 8 años, 8 meses
Puntos: 0
Consulta SQL no

Código MySQL:
Ver original
  1. SELECT SUM( LCANTI ) , LFECPED
  2. FROM  `fcloc001`
  3. WHERE LCODAR =  "Q2612A-R"
  4. AND LPED >0
  5. LFECPED
  6. )
  7. ORDER BY  `fcloc001`.`LFECPED` DESC
  8. LIMIT 0 , 30

Tengo esa consulta pero claro, a mi me interesa no solo que me saque los datos que den resultados, me interesa que si el dia 23 no encuentra nada me saque la fecha del dia 23 con un 0 como que no ha encontrado nada (o un NULL me es indiferente).
El fin seria obtener todas las tuplas de todos los dias con los resultados que encuentre y aquellos de los que no haya datos con un 0.

Muchisimas gracias, llevo tiempo con esto y no veo la forma...

Última edición por gnzsoloyo; 24/03/2016 a las 18:54
  #2 (permalink)  
Antiguo 23/03/2016, 04:54
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, 4 meses
Puntos: 2658
Respuesta: Consulta SQL no

Cita:
me interesa que si el dia 23 no encuentra nada me saque la fecha del dia 23 con un 0 como que no ha encontrado nada (o un NULL me es indiferente).
Los DBMS solo pueden trabajar con datos que existen. SI tu tabla no tiene ningún registro donde la fecha del dia 23 aparezca, no hay modo que devuelva nada, porque no tiene de donde "inventar" un día 23. Y los DBMS no crean dias...
Lo que suele hacerse para solucionar estos casos es crear una tabla temporal con todas las fechas a procesar y usarla en la consulta por medio de un LEFT JOIN.
Yo te aconsejo que lo realices por medio de un stored procedure. Es mucho mas simple y controlable para obtener reportes de esta clase.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 23/03/2016, 05:00
 
Fecha de Ingreso: julio-2015
Mensajes: 25
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Consulta SQL no

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Los DBMS solo pueden trabajar con datos que existen. SI tu tabla no tiene ningún registro donde la fecha del dia 23 aparezca, no hay modo que devuelva nada, porque no tiene de donde "inventar" un día 23. Y los DBMS no crean dias...
Lo que suele hacerse para solucionar estos casos es crear una tabla temporal con todas las fechas a procesar y usarla en la consulta por medio de un LEFT JOIN.
Yo te aconsejo que lo realices por medio de un stored procedure. Es mucho mas simple y controlable para obtener reportes de esta clase.
Muchas garcias por la respuesta : )

Hablo desde el desconocimiento pero...
Si MYSQL tiene funciones para fecha ¿No puede decir por ejemplo que el ultimo año tiene estos dias y despues ir dia por dia viendo si hay alguna coincidencia en la tabla?
De no poderse tendre que recurrir a PHP (procedure no controlo) y seria muy comodo que me lo devolviese ya bien la bbdd

Un saludo
  #4 (permalink)  
Antiguo 23/03/2016, 05:06
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, 4 meses
Puntos: 2658
Respuesta: Consulta SQL no

Cita:
Si MYSQL tiene funciones para fecha ¿No puede decir por ejemplo que el ultimo año tiene estos dias y despues ir dia por dia viendo si hay alguna coincidencia en la tabla?
Precisamente ESO requeriría un stored procedure, que utilice las funciones de fecha...

Entiende esto: Los DBMS (no sólo MySQL), trabajan con datos en tablas, u otras estructuras de datos de la base, es decir con objetos que existen en su propio entorno. Para realizar una comparación entre un dato en una tabla con otro dato, ese dato tiene que ESTAR en algún objeto del mismo tipo o que pueda transformarse (una función, por ejemplo) en el mismo tipo de dato.
POr eso la forma mas simple es crear dentro del SP una tabla temporal para realizar el cálculo. De ese modo se puede utilizar la potencia del motor de consultas para resolver en una sola ejecución la consulta. Y sin necesidad de andar recorriendo nada.

No mires las BBDD como si fuesen procesos de una aplicación. Manejar datos no es lo mismo que manejar procesos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 23/03/2016, 05:14
 
Fecha de Ingreso: julio-2015
Mensajes: 25
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Consulta SQL no

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Precisamente ESO requeriría un stored procedure, que utilice las funciones de fecha...

Entiende esto: Los DBMS (no sólo MySQL), trabajan con datos en tablas, u otras estructuras de datos de la base, es decir con objetos que existen en su propio entorno. Para realizar una comparación entre un dato en una tabla con otro dato, ese dato tiene que ESTAR en algún objeto del mismo tipo o que pueda transformarse (una función, por ejemplo) en el mismo tipo de dato.
POr eso la forma mas simple es crear dentro del SP una tabla temporal para realizar el cálculo. De ese modo se puede utilizar la potencia del motor de consultas para resolver en una sola ejecución la consulta. Y sin necesidad de andar recorriendo nada.

No mires las BBDD como si fuesen procesos de una aplicación. Manejar datos no es lo mismo que manejar procesos.
ok, ya entiendo. En ese caso lo solucionare de otra manera. Muchas gracias por la pronta respuesta.
  #6 (permalink)  
Antiguo 23/03/2016, 05:29
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, 4 meses
Puntos: 2658
Respuesta: Consulta SQL no

Cita:
En ese caso lo solucionare de otra manera.
¿Por qué?
¿Tan complejo te resulta hacer este código?:

Código MySQL:
Ver original
  1. CREATE PROCEDURE `consultar_fcloc001` ()
  2. DECLARE vFechaIni DATE;
  3. DECLARE vFechaFin date;
  4. SET vFechaIni = DATE('2016-01-01');
  5. SET vFechaFin = DATE('2017-01-01');
  6. WHILE vFechaIni < vFechaFin DO
  7. INSERT INTO fechas VALUES(vFechaIni);
  8. SET vFechaIni = ADDDATE(vFechaIni, INTERVAL 1 DAY);
  9. END WHILE;
  10.     fecha LCODAR, CantPedidos
  11.     (SELECT
  12.         fecha, SUM(LCANTI) CantPedidos
  13.     FROM
  14.         fechas F
  15.     LEFT JOIN `fcloc001` P ON F.fecha = DATE(P.LFECPED)
  16.     WHERE
  17.         (LCODAR = 'Q2612A-R' AND LPED > 0)
  18.             OR F.fecha IS NULL
  19.     GROUP BY fecha)
  20. ORDER BY LFECPED DESC
  21. LIMIT 30;
  22.  

Yo tengo algo de práctica, y solo me llevo cinco minutos. Aprender a hacerlo tal vez te lleve algo más, pero se supone que para eso vienes a FDW, a que podamos ayudarte a aprender.
¿no?

No retrocedas ante dificultades como esta. Mas adelante vas a enfrentar peores y es mejor ir aprendiendo en etapas.
__________________
¿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; 23/03/2016 a las 05:37
  #7 (permalink)  
Antiguo 23/03/2016, 06:05
 
Fecha de Ingreso: julio-2015
Mensajes: 25
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Consulta SQL no

Cita:
Iniciado por gnzsoloyo Ver Mensaje

Yo tengo algo de práctica, y solo me llevo cinco minutos. Aprender a hacerlo tal vez te lleve algo más, pero se supone que para eso vienes a FDW, a que podamos ayudarte a aprender.
¿no?

No retrocedas ante dificultades como esta. Mas adelante vas a enfrentar peores y es mejor ir aprendiendo en etapas.
Pues muchas gracias, lo cierto es que nunca lo habia hecho y por eso trato siempre de resolver los problemas con los lenguajes que conozco, en este caso PHP.

Aprovecho la réplica para preguntarte si se te ocurre como podria agruparlo en lugar de por dias (es como esta ahora) por intervalos de X dias, por ejemplo, por intervalos de 60 dias, para que asi la consulta me sacase los datos que encuentra en cada intervalo.

Un saludo y muchisimas gracias gnzsoloyo : )
  #8 (permalink)  
Antiguo 23/03/2016, 06:40
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, 4 meses
Puntos: 2658
Respuesta: Consulta SQL no


Por trimestre sería mucho mas simple, hay una función específica para esos períodos. Por bimestres... voy atener que pensar como crear una columna que me permita distinguirlos.

Dejame que lo medite.
__________________
¿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 24/03/2016, 18:52
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, 4 meses
Puntos: 2658
Respuesta: Consulta SQL no

Bueno, después de meditarlo un poco, al final me di cuenta que lo mejor era usar CASE, que es una función de control de flujo que detesto usar en MySQL.
CASE tiene algunas veces un comportamiento que no me convence en este DBMS, aunque es una buena solución en otros.

Ahora bien, suponiendo que quieras que te devuelva los datos en un período a indicar, se puede hacer que el SP reciba dos parámetros (fecha de inicio y fecha de fin). También podemos hacer que si la segunda se la pasas en NULL, te tome la primera como inicio y el final hasta el día en curso.

La idea sería mas o menos así:

Código MySQL:
Ver original
  1. delimiter $$
  2. DROP PROCEDURE IF EXISTS  `consultar_fcloc001`$$
  3.  
  4. CREATE PROCEDURE `consultar_fcloc001` (IN fechaIni DATE, IN fechaFin DATE)
  5.  
  6. DECLARE vFechaIni DATE;
  7. DECLARE vFechaFin date;
  8. SET vFechaIni = DATE('2016-01-01');
  9. SET vFechaFin = DATE('2017-01-01');
  10. WHILE vFechaIni < vFechaFin DO
  11. INSERT INTO fechas VALUES(vFechaIni);
  12. SET vFechaIni = ADDDATE(vFechaIni, INTERVAL 1 DAY);
  13. END WHILE;
  14. IF fechaFin is null then
  15.     set fechaFin = CURDATE();
  16.     end if;
  17.     bimestre LCODAR, SUM(LCANTI) CantPedidos
  18.     (SELECT
  19.         (CASE
  20.                 WHEN MONTH(fecha) IN (1 , 2) THEN 1
  21.                 WHEN MONTH(fecha) IN (3 , 4) THEN 2
  22.                 WHEN MONTH(fecha) IN (5 , 6) THEN 2
  23.                 WHEN MONTH(fecha) IN (7 , 8) THEN 2
  24.                 WHEN MONTH(fecha) IN (9 , 10) THEN 2
  25.                 WHEN MONTH(fecha) IN (11 , 12) THEN 2
  26.             END) bimestre,
  27.             LCANTI
  28.     FROM
  29.         fechas F
  30.     LEFT JOIN `fcloc001` P ON F.fecha = DATE(P.LFECPED)
  31.     WHERE
  32.         (LCODAR = 'Q2612A-R' AND LPED > 0
  33.             AND f.fecha BETWEEN fechaIni AND fechaFin)
  34.             OR F.fecha IS NULL)
  35. GROUP BY bimestre DESC
  36. LIMIT 30;
  37.  
  38. END$$

Espero que al menos te sirva de inspiración...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 28/03/2016, 00:55
 
Fecha de Ingreso: julio-2015
Mensajes: 25
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Consulta SQL no

Es más complejo de lo que esperaba. Muchas gracias ^^

Etiquetas: fecha, select, sql
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 11:38.