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

Valor 0 consulta

Estas en el tema de Valor 0 consulta en el foro de Mysql en Foros del Web. Buenos días, mi problema es el siguiente: Tengo una BBDD con las estaciones de salida y llegada de trenes. Para saber cuales son las rutas ...
  #1 (permalink)  
Antiguo 03/07/2012, 05:16
 
Fecha de Ingreso: julio-2012
Mensajes: 3
Antigüedad: 11 años, 9 meses
Puntos: 0
Valor 0 consulta

Buenos días, mi problema es el siguiente:

Tengo una BBDD con las estaciones de salida y llegada de trenes. Para saber cuales son las rutas más utilizadas y las que no se utilizan

Tengo la siguiente Tabla

Tabla1:
+++++++++++++++++++++++
ID------ EInicio -------EFinal-------GRUPO
1----------- 1--------- 2------------102
2------------2----------3------------203
3------------1----------3------------103
4------------1----------2------------102
5------------1----------2------------102
6------------3----------1------------301
7------------2----------1------------201
+++++++++++++++++++++++

Quiero que me devuelva una tabla así:
++++++++++++++++
GRUPO ------TOTAL
101 ------------ 0
102-------------3
103-------------1
201-------------1
202-------------0
203-------------0
301-------------1
302-------------0
303-------------1
+++++++++++++++


He probado con un Group By pero no me devuelve los valores con 0. Que tendría que utilizar? mi idea es crear una tabla con todos los grupos y rellenarla con un left join o algo por el estilo, pero ando un poco escaso de sql. Alguien me podría ayudar?

Muchas Gracias.
  #2 (permalink)  
Antiguo 03/07/2012, 05:27
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Valor 0 consulta

No puede devolver lo que no esta en la tabla....

Si tienes una tabla con todos los grupos luego es más fácil....

Código MySQL:
Ver original
  1. SELECT Tabla0.GRUPO,
  2.             Sum(If(Tabla1.GRUPO Is Null,0,1)) AS Total
  3. FROM Tabla0 LEFT JOIN Tabla1 ON Tabla0.GRUPO = Tabla1.GRUPO
  4. GROUP BY Tabla0.GRUPO;

Tabla0
GRUPO
101
102
103
201
202
203
301
302
303
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 04/07/2012, 03:02
 
Fecha de Ingreso: julio-2012
Mensajes: 3
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Valor 0 consulta

Gracias, pero sigue dandome los valores igual que el group by
  #4 (permalink)  
Antiguo 04/07/2012, 04:11
 
Fecha de Ingreso: junio-2011
Mensajes: 139
Antigüedad: 12 años, 10 meses
Puntos: 42
Respuesta: Valor 0 consulta

Hola amarimon,

Con lo que mencionas no es sencillo saber como ayudarte, he creado un pequeño ejemplo con la información que muestras, quizás con ello puedas explicar mejor el problema. http://sqlfiddle.com/#!2/c38e3/1
  #5 (permalink)  
Antiguo 04/07/2012, 07:03
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Valor 0 consulta

El ejemplo que te da wchiquito es exáctamente la misma solución que te daba yo (donde yo digo tabla0 el dice grupo y donde el dice count(t1.`idgrupo`) yo digo Sum(If(Tabla1.GRUPO IS NULL,0,1))).

Si no te funciona es que no lo aplicas bien.

Entiendes que no te puede retornar lo que no esta en la tabla?
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 04/07/2012 a las 07:11
  #6 (permalink)  
Antiguo 04/07/2012, 07: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, 4 meses
Puntos: 2658
Respuesta: Valor 0 consulta

Vamos a ver si una explicación más básica de lo que te dice quimfv te sirve para entender lo que te tratan de explicar.
- La tabla de muestra que pones no contiene ningún registro del Grupo "101", por o que si agrupas por Grupo, jamás aparecerá ese "101". Por eso te dice quimfv que "No puede devolver lo que no esta en la tabla."
- Para realizar un reporte de un listado completo de Grupos, necesitas la lista completa de grupos, que no está en esa tabla. Es decir que necesitas otra tabla con ese listado.
- Usando las dos tablas, entonces se puede verificar cuántas apariciones hay en la segunda tabla, de cada uno de los Grupos de la primera tabla... y eso en una sola consulta.

¿Se entiende mejor así?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 11/07/2012, 04:01
 
Fecha de Ingreso: julio-2012
Mensajes: 3
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Valor 0 consulta

muchas gracias a todos, siento contestar tarde. Una última pregunta si quisiera introducir claúsulas where, donde tendría que introducirlas para que me dieran los 0? porque si las pongo antes del group by no me salen los 0.

Por ejemplo si quisiera que me devolvieran solo los que tienen einicio=2;

Repito, muchas gracias a todos por sus explicaciones, respuestas y ejemplos.
  #8 (permalink)  
Antiguo 11/07/2012, 06:43
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: Valor 0 consulta


Cita:
si quisiera introducir claúsulas where, donde tendría que introducirlas para que me dieran los 0


Disculpa mi asombro, pero lo que estás preguntando muestra que te está faltado estudiar mucho SQL, o bien lo que te han enseñado está espantosamente mal, así que la primera recomendación es que antes de seguir adelante con tu proyecto, te detengas un poco a estudiar el tema de Base de Datos y especialmente SQL.
Evitará que te metas en serios problemas de desarrollo en el futuro próximo.

Ahora pasemos a contestarte:
1) La cláusula WHERE va siempre en un único lugar, y no puede jamás ir en otro sin generar un error de sintaxis: Inmediatamente después del FROM. Eso es el estándar y no se cambia en ningún DBMS.
2) Que te salgan ceros no depende de que valgan cero en tu caso, sino que dependen de que no haya valores relacionados, con lo que lo que debes buscar no es el cero (0) sino el NULL, que no es lo mismo.
3) El NULL no se puede buscar usando "=", porque no es un dato. Es un estado o puntero a la nada, y para determinar si algo es NULL se usa IS NULL o bien IS NOT NULL, aplicado sobre el campo correspondiente.

Sería mas o menos algo así:
Código MySQL:
Ver original
  1. SELECT T1.a, T1.b, T1.c, SUM(T2.d) d
  2. FROM T1 LEFT JOIN T2 ON T1.a = T2.a
  3. GROUP BY T1.a;
__________________
¿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; 11/07/2012 a las 11:22

Etiquetas: count, join, left, 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 07:30.