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

Problema consulta group by y having

Estas en el tema de Problema consulta group by y having en el foro de Mysql en Foros del Web. Hola coampañeritos de este foro, deseo hacer una consulta en Mysql cuando hago la consulta de esta manera es correcto me muestra los registros sumados ...
  #1 (permalink)  
Antiguo 13/01/2009, 13:02
 
Fecha de Ingreso: enero-2009
Mensajes: 67
Antigüedad: 15 años, 3 meses
Puntos: 1
Problema consulta group by y having

Hola coampañeritos de este foro, deseo hacer una consulta en Mysql cuando hago la consulta de esta manera es correcto me muestra los registros sumados y agrupados por el campo especificado:

SELECT `codigo` , `codigomatricula` , `nombres` , `curso` , mes, SUM( `valor` ) FROM meses WHERE curso = "sexto" AND paralelo = "b" GROUP BY `codigomatricula` HAVING `mes` =11

Cuando se cambia el valor a HAVING `mes` =11

Osea cuando hago esto me muestra los registros pero no me vuelve a sumar como el caso anterior:

SELECT `codigo` , `codigomatricula` , `nombres` , `curso` , mes, SUM( `valor` ) FROM meses WHERE curso = "sexto" AND paralelo = "b" GROUP BY `codigomatricula` HAVING `mes` = 22

Lo que quiero que me vuelva a sumar agrupado por el campo especificado y el mes que modifico


gracias de antemano.
  #2 (permalink)  
Antiguo 14/01/2009, 08:02
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema consulta group by y having

Si la unica diferencia entre las dos cunsultas es el valor del mes luego será que no tienes ninguno con el mes 22... pero no deberia darte nada en este caso...

¿¿??

Quim
  #3 (permalink)  
Antiguo 14/01/2009, 08:09
 
Fecha de Ingreso: enero-2009
Mensajes: 67
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Problema consulta group by y having

Hola quimfv, si tengo registros con el 22 y otros valores, pero no me vuelve a sumar y estoy desesperado.

gracias
  #4 (permalink)  
Antiguo 14/01/2009, 08:54
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Problema consulta group by y having

Ivan2009,
¿Probaste esto que te dije en otro post que abriste sobre el mismo tema?:

SELECT `codigo` , `codigomatricula` , `nombres` , `curso` , mes, SUM( `valor` ) FROM meses WHERE curso = "sexto" AND paralelo = "B" AND `mes` = '22' GROUP BY `codigomatricula`
  #5 (permalink)  
Antiguo 14/01/2009, 09:19
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: Problema consulta group by y having

Dos cosas:
1. Según el esquema de la consulta que estás poniendo:
Código sql:
Ver original
  1. SELECT `codigo` , `codigomatricula` , `nombres` , `curso` , mes, SUM( `valor`)
  2. FROM meses
  3. WHERE curso = 'sexto' AND paralelo = 'b'
  4. GROUP BY `codigomatricula`
  5. HAVING `mes` = 22
Esta tiene tres condiciones para poder realizarse: a) El PARALELO debe ser igual a "B", y b) el CURSO debe ser "SEXTO" y c) MES debe ser "33"...

Ahora bien, si me remito al ejemplo que pones en un post anterior , Tienes, por ejemplo, estos datos:
Cita:
1 34 JUAN PEREZ 3 A 45454 2008-11-12 22 16 0
2 32 MARIA CALLE 1 A 45454 2008-12-02 11 16 0
3 35 IVAN PEREZ 1 A 45454 2008-10-12 11 32 0
4 36 LOURDES P 1 C 45454 2008-12-12 22 50 0
5 32 MARIA CALLE 1 A 45454 2008-12-02 33 16 0
6 35 IVAN PEREZ 1 A 45454 2008-10-12 11 32 0
7 35 IVAN PEREZ 1 A 45454 2008-10-12 11 32 0
Aunque uno de los valores si se cumple (MES es 33), no se cumple una condición previa: Ninguno de los registros tiene PARALELO igual a "B".
En definitiva, no hay forma con esos valores que la consulta sume nada... porque no hay registros para sumar.

Además, en ese tipo de consulta, como te indica jurena, MES no debe ir en el HAVING sino en el WHERE, ya que no estás calculando nada con él ni usando un calculo hecho con ese campo, sino que lo estás usando para acotar la selección.

2. Muy importante a nivel de foro: Estás multiplicando inútilmente el tema con la misma pregunta. Ya has puesto la pregunta al menos cuatro veces en diferentes POSTS y eso hace que sea muy difícil seguir la evolución de las respuestas y soluciones que te planteas. Trata de usar un sólo tema por pregunta y de esa forma podremos colaborar mejor contigo. De lo contrario se vuelve muy confuso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 14/01/2009, 09:50
 
Fecha de Ingreso: enero-2009
Mensajes: 67
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Problema consulta group by y having

hola que tal,
Es verdad en el ejemplo que pongo en el post no hay registros que se cumplan con esa condiciones, pero si tengo en mi tabla como 2000 registros que se cumplen las condiciones , ahora bien cuando pongo esto que me dice jurena no me suma nada:

SELECT `codigo` , `codigomatricula` , `nombres` , `curso` , mes, SUM( `valor` ) FROM meses WHERE curso = "6" AND paralelo = "B" AND `mes` = '11' GROUP BY `codigomatricula`


gracias por contestar
  #7 (permalink)  
Antiguo 14/01/2009, 10:20
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: Problema consulta group by y having

Si esto:
Código sql:
Ver original
  1. SELECT `codigo` , `codigomatricula` , `nombres` , `curso` , mes,  SUM( `valor`)
  2. FROM meses
  3. WHERE curso = 'sexto' AND paralelo = 'b'  AND `mes` = 22
  4. GROUP BY `codigomatricula`;
o si CURSO es numérico, esto:
Código sql:
Ver original
  1. SELECT `codigo` , `codigomatricula` , `nombres` , `curso` , mes,  SUM( `valor`)
  2. FROM meses
  3. WHERE curso = 6 AND paralelo = 'b'  AND `mes` = 22
  4. GROUP BY `codigomatricula`;
no te devuelve resultados, es que no existe ningún registro que cumpla las tres condiciones al mismo tiempo y que tenga valores a sumar.
Cuidado con las comillas, las cadenas de caracteres se deben colocar entre apóstrofes o de lo contrario los tomará como nombres de campos.
__________________
¿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; 14/01/2009 a las 10:27
  #8 (permalink)  
Antiguo 14/01/2009, 11:06
 
Fecha de Ingreso: enero-2009
Mensajes: 67
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Problema consulta group by y having

sigo sin solucionar este problema si alguien me puede ayudar con esta consulta
gracias
  #9 (permalink)  
Antiguo 14/01/2009, 11: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, 5 meses
Puntos: 2658
Respuesta: Problema consulta group by y having

Cita:
Iniciado por ivan2009 Ver Mensaje
sigo sin solucionar este problema si alguien me puede ayudar con esta consulta
gracias
¿Has probado lo que te pasé? ¿Qué es lo que devuelve?
¿Cuántos registros devuelve esta consulta:
Código sql:
Ver original
  1. SELECT *
  2. FROM meses
  3. WHERE curso = 6 AND paralelo = 'b' AND `mes` = 22
  4. GROUP BY `codigomatricula`;

Por favor, responde la pregunta para comprender mejor el problema.
__________________
¿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 14/01/2009, 12:07
 
Fecha de Ingreso: enero-2009
Mensajes: 67
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Problema consulta group by y having

ya probe y me devuelve 30 registros para este curso paralelo y mes pero curso esta en letras entonces le pongo asi:

SELECT * FROM meses WHERE curso = "sexto" AND paralelo = 'b' AND `mes` =22
GROUP BY `codigomatricula`

Tengo 90 registros para este curso paralelo y mes está de esta manera 11 22 y 33
Tengo sumar el total por cada usuario cuanto ha pagado en cualquier mes que haga la consulta
por ejemplo si consulto 11 o 22 o 33 tiene que mostrarme el total pagado, por cualquier mes

ahora quiero sumar pero me da error y tengo que agruparle por codigomatricula y ahi me sale sin error pero no suma, ya que tengo mes 11,22,3 etc.

gracias por tu respuesta
  #11 (permalink)  
Antiguo 14/01/2009, 12:20
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: Problema consulta group by y having

¿Me puedes decir si existe algún NULL dentro de esos 30 registros en el campo "valor"?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 14/01/2009, 12:41
 
Fecha de Ingreso: enero-2009
Mensajes: 67
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Problema consulta group by y having

SI existen algunos registros en el campo valor con null, será ese el problema probaré llenando y te indico LUEGO ?
gracias
  #13 (permalink)  
Antiguo 14/01/2009, 13: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, 5 meses
Puntos: 2658
Respuesta: Problema consulta group by y having

Si. ese debe ser el problema.
Como regla universal, todo valor sumado, encadenado, multiplicado, restado o sumado a un NULL, da NULL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 14/01/2009, 13:34
 
Fecha de Ingreso: enero-2009
Mensajes: 67
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Problema consulta group by y having

Hola te cuento que sigue el problema aunque ya llenes todos los valores al campo valor ya qque era null y no puedo consultar osea sumar para cada mes.

gracias
  #15 (permalink)  
Antiguo 14/01/2009, 13:50
 
Fecha de Ingreso: enero-2009
Mensajes: 67
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Problema consulta group by y having

Estos son los datos de los registros del problema por favor si me puedes dar otra idea para sumar y darme cuenta cuanto ha pagado cada usuario, como sería:

codigo codigomatricula nombres curso paralelo mes valor
1270, 10116, 'CHANGO CUENCA YOLANDA ALEXANDRA', 'SEXTO', 'B', '11', 16
1280, 10660, 'ALAVA CEDEÑO ANDREA GABRIELA', 'SEXTO', 'B', '11', 16
1285, 10691, 'AVILA NARVAEZ ANGELICA ANDREA', 'SEXTO', 'B', '11', 16
7279, 10116, 'CHANGO CUENCA YOLANDA ALEXANDRA', 'SEXTO', 'B', '33', 16
7289, 10660, 'ALAVA CEDEÑO ANDREA GABRIELA', 'SEXTO', 'B', '33', 16
7294, 10691, 'AVILA NARVAEZ ANGELICA ANDREA', 'SEXTO', 'B', '33', 16
5277, 10116, 'CHANGO CUENCA YOLANDA ALEXANDRA', 'SEXTO', 'B', '22', 16
5287, 10660, 'ALAVA CEDEÑO ANDREA GABRIELA', 'SEXTO', 'B', '22', 16
5292, 10691, 'AVILA NARVAEZ ANGELICA ANDREA', 'SEXTO', 'B', '22', 16

estaba haciendo esto mismo y si me muestra los registros por el mes de 11 osea de la siguiente manera:
SELECT `codigo` , `codigomatricula` , `nombres` , `curso` , mes, SUM( `valor` )
FROM meses
WHERE curso = "sexto"
AND paralelo = "b"
GROUP BY `codigomatricula`
HAVING `mes` ='11'


Esto me hace con el criterio anterior que sería lo correcto a observar. Pero cuando cambio al mes a 22 o 33 no me hace la suma, pero me muestra los registros filtrados:

codigo codigomatricula nombres curso paralelo mes valor
1299, 9652, 'CASTRO GOMEZ CARMEN LILIANA', 'SEXTO', '11', 48
1376, 10092, 'CALDERON POTOSI LESLIE MICHELLE', 'SEXTO', '11', 48
1270, 10116, 'CHANGO CUENCA YOLANDA ALEXANDRA', 'SEXTO', '11', 48

TAMBIEN LE HICE DENTRO DEL WHERE SIN EL HAVING TODO PERO NO ME SUMA, CLARO ME MUESTRA LOS REGISTROS PERO SIN SUMAR

gracias DE ANTEMANO

Última edición por ivan2009; 14/01/2009 a las 15:31
  #16 (permalink)  
Antiguo 14/01/2009, 19:44
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: Problema consulta group by y having

Bien, probé con tu estructura de tabla (tomada de este post), con el conjunto de datos que indicas en el último:
Cita:
codigo codigomatricula nombres curso paralelo mes valor
1270, 10116, 'CHANGO CUENCA YOLANDA ALEXANDRA', 'SEXTO', 'B', '11', 16
1280, 10660, 'ALAVA CEDEÑO ANDREA GABRIELA', 'SEXTO', 'B', '11', 16
1285, 10691, 'AVILA NARVAEZ ANGELICA ANDREA', 'SEXTO', 'B', '11', 16
7279, 10116, 'CHANGO CUENCA YOLANDA ALEXANDRA', 'SEXTO', 'B', '33', 16
7289, 10660, 'ALAVA CEDEÑO ANDREA GABRIELA', 'SEXTO', 'B', '33', 16
7294, 10691, 'AVILA NARVAEZ ANGELICA ANDREA', 'SEXTO', 'B', '33', 16
5277, 10116, 'CHANGO CUENCA YOLANDA ALEXANDRA', 'SEXTO', 'B', '22', 16
5287, 10660, 'ALAVA CEDEÑO ANDREA GABRIELA', 'SEXTO', 'B', '22', 16
5292, 10691, 'AVILA NARVAEZ ANGELICA ANDREA', 'SEXTO', 'B', '22', 16
y es cierto, no te lo devuelve, pero la razón es bastante simple:

Desglosemos:

1. Cuando hay una clave declarada y sobre todo la primaria, que en este caso es "codigo" y luego "codigomateria", si no hay un ORDER BY, MySQL ordena los resultados en función de esas claves, para luego ordenarlos sucesivamente y en orden de aparición por los diferentes campos.

2. Esto hace que el valor "11" sea el primero en aparecer para cada grupo de registros que coinciden en el "codigomateria", mas o menos en este orden:
Cita:
"codigo","codigomatricula","nombres","curso","para lelo","mes","valor"
1270,10116,"CHANGO CUENCA YOLANDA ALEXANDRA","SEXTO","B","11",16
1280,10660,"ALAVA CEDEÑO ANDREA GABRIELA","SEXTO","B","11",16
1285,10691,"AVILA NARVAEZ ANGELICA ANDREA","SEXTO","B","11",16
5277,10116,"CHANGO CUENCA YOLANDA ALEXANDRA","SEXTO","B","22",16
5287,10660,"ALAVA CEDEÑO ANDREA GABRIELA","SEXTO","B","22",16
5292,10691,"AVILA NARVAEZ ANGELICA ANDREA","SEXTO","B","22",16
7279,10116,"CHANGO CUENCA YOLANDA ALEXANDRA","SEXTO","B","33",16
7289,10660,"ALAVA CEDEÑO ANDREA GABRIELA","SEXTO","B","33",16
7294,10691,"AVILA NARVAEZ ANGELICA ANDREA","SEXTO","B","33",16
Como podrás ver, los "valor" que contienen el 33 se acumulan al final, por cuanto el resto de los campos tienen el mismo valor entre sí, salvando el nombre.

3. Como luego del WHERE hay un GROUP BY, esto hace que los registros de valores coincidentes en ese campo se agrupen dejando solamente el primero... cuyo valor en "valor" es 11. Todo el resto de los valores desaparecen.
El resultado es esto:
Cita:
"codigo","codigomatricula","nombres","curso","mes" ,"SUM(`valor`)"
1270,10116,"CHANGO CUENCA YOLANDA ALEXANDRA","SEXTO","11",48
1280,10660,"ALAVA CEDEÑO ANDREA GABRIELA","SEXTO","11",48
1285,10691,"AVILA NARVAEZ ANGELICA ANDREA","SEXTO","11",48
4. Finalmente, el HAVING opera sobre esa tabla resultado, por lo que al no haber ningún registro con campo "valor" en 22, no hay ningún registro devuelto. Suma cero.

¿Cómo se resuelve esto? De la misma forma en que hemos insistido con jurena: El `valor`= 22 va en el WHERE, no en el HAVING.
Si usas esta sentencia:
Código sql:
Ver original
  1. SELECT
  2.   `codigo`,
  3.   `codigomatricula`,
  4.   `nombres`,
  5.   `curso`,
  6.   `mes`,
  7.   SUM(`valor`)
  8. FROM meses
  9. WHERE curso = "sexto"
  10. AND paralelo = "b" AND MES=22
  11. GROUP BY `codigomatricula`;
obtendrás el resultado esperado.

Todo el problema es que estás suponiendo que la lógica de la consulta opera como un todo, y no es así. Ciertas cláusulas operan sobre los resultados intermedios.
Además, te repito, el HAVING no se usa para el uso que pretendes darle, sino para operar fundamentalmente sobre valores calculados o rangos de uno campo, pero en cualquier caso, operarán sobre el resultado final de la sentencia, no antes.

Respecto a que no sume los valores, no los sumará jamás si no hay más de un registro donde la misma persona (codigomateria) tenga curso = "SEXTO", paralelo="B" y mes=22... por la simple razón que estás agrupando por codigomateria, que parece ser clave de la persona. ¿Puede darse esa condición?
En los hechos, ese agupamiento carece de sentido.
Si lo que quieres es saber cuantos meses pagó cada uno, hay que agrupar por codigomateria, si deseas saber cuantos pagaron el mes, hay que agrupar por mes, y así. Pero agrupar por persona y restringir todos los valores clave, no produce ningún resultado.

Daría lo mismo que si hicieras esto:
Código sql:
Ver original
  1. SELECT
  2.   `codigo`,
  3.   `codigomatricula`,
  4.   `nombres`,
  5.   `curso`,
  6.   `mes`,
  7.   SUM(`valor`)
  8. FROM meses
  9. WHERE curso = "sexto"
  10. AND paralelo = "b" AND MES=22
  11. GROUP BY `nombres`;
o esto:
Código sql:
Ver original
  1. SELECT
  2.   `codigo`,
  3.   `codigomatricula`,
  4.   `nombres`,
  5.   `curso`,
  6.   `mes`,
  7.   `valor`
  8. FROM meses
  9. WHERE curso = "sexto"
  10. AND paralelo = "b"
  11. AND MES=22;
En definitiva es un problema de lógica, no de codificación. ¿Se comprende?
__________________
¿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; 14/01/2009 a las 19:58
  #17 (permalink)  
Antiguo 15/01/2009, 09:50
 
Fecha de Ingreso: enero-2009
Mensajes: 67
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Problema consulta group by y having

hola amigo
Te cuento no se si no esta muy claro.
Deseo consultar sea cual sea el mes este y me sume de todos de los meses pagados
Usando el where y agrupando por codigomatricula, nombres u otro.... me muestra los registros solo pagado correspondiente a ese mes y no suma el total.



gracias DE ANTEMANO
  #18 (permalink)  
Antiguo 15/01/2009, 10:22
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: Problema consulta group by y having

El tema es como te digo arriba: el problema es la lógica de lo que quieres hacer, y la consulta que estabas elaborando, eliminaba registros. Por eso no da los resultados esperados.
El tema es sencillo, lo que tu quieres, entonces es:
1. Código de Matrícula de alumno.
2. Nombre del alumno.
3. Último mes pagado.
4. Total pagado a la fecha.

Eso sería:
Código sql:
Ver original
  1. SELECT
  2.  `codigo`,
  3.  `codigomatricula`,
  4.  `nombres`,
  5.  `curso`,
  6.  MAX(`mes`) 'Ultimo pagado',
  7.  SUM(`valor`) 'Total abonado'
  8. FROM meses
  9. WHERE curso = "sexto"
  10. AND paralelo = "b"
  11. GROUP BY `codigomatricula`;

Si lo que quieres, es el total abonado hasta un mes determinado, la cosa cambia en el WHERE:
Código sql:
Ver original
  1. SELECT
  2.   `codigo`,
  3.   `codigomatricula`,
  4.   `nombres`,
  5.   `curso`,
  6.   MAX(`mes`) 'Pagado hasta mes',
  7.   SUM(`valor`) 'Total abonado'
  8. FROM meses
  9. WHERE curso = "sexto"
  10. AND paralelo = "b"
  11. AND mes <= 22
  12. GROUP BY `codigomatricula`;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #19 (permalink)  
Antiguo 15/01/2009, 10:54
 
Fecha de Ingreso: enero-2009
Mensajes: 67
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Problema consulta group by y having

Bueno muchas graciasamigo , voy a reestructurar la tabla ya que tengo que hacer con todos los meses.

gracias
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 03:51.