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

Problema con la clausula HAVING

Estas en el tema de Problema con la clausula HAVING en el foro de Mysql en Foros del Web. Hola, estoy empleando como SGBD MySQL y tengo el siguiente problemilla: 1) Quiero seleccionar el valor medio de una columna, pero con una determinada restriccion ...
  #1 (permalink)  
Antiguo 26/12/2008, 18:51
 
Fecha de Ingreso: diciembre-2008
Mensajes: 14
Antigüedad: 15 años, 4 meses
Puntos: 0
Problema con la clausula HAVING

Hola,

estoy empleando como SGBD MySQL y tengo el siguiente problemilla:

1) Quiero seleccionar el valor medio de una columna, pero con una determinada restriccion (las filas pertenecionentes a "valor de col2"). Por ej:

"SELECT AVG(col) from <table> GROUP BY <col2> HAVING col2='valor de col2'"

Hasta aqui funciona perfectamente.

2) Quiero hacer lo mismo, pero añado una nueva restriccion, col3. Para ello hago:

"SELECT AVG(col) from <table> GROUP BY <col2>,<col3> HAVING col2='valor de col2' AND col3<'valor de col3'"

Y aqui ya no funciona. En lugar de seleccionar las filas con 'valor de col2' y valores menores que 'valor de col3', selecciona la primera fila con 'valor de col2' y valor menor que 'valor de col3'.

Un saludo.
  #2 (permalink)  
Antiguo 27/12/2008, 03:03
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Problema con la clausula HAVING

"SELECT AVG(col) from <table> WHERE <col2> = 'valorcolumna2' AND <col3> = 'valorcolumna3' GROUP BY <col2>

No lo he probado, pero ya nos dirás.
  #3 (permalink)  
Antiguo 27/12/2008, 04:53
 
Fecha de Ingreso: diciembre-2008
Mensajes: 14
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Problema con la clausula HAVING

Muchas gracias Jurena, parece que funciona. Ahora solo me queda saber porque no funcionaba con la clausula Having
  #4 (permalink)  
Antiguo 27/12/2008, 07:08
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Problema con la clausula HAVING

Creo que hay un problema. No me di cuenta de que escribiste AVG(col). Si col es una columna distinta de col2 y col3, y buscas la media de col, debes escribirlo así
"SELECT AVG(col) from <table> WHERE <col2> = 'valorcolumna2' AND <col3> = 'valorcolumna3' GROUP BY <col>


Ahora un intento de explicación:
Lo primero que hiciste, no creo que te sacara lo que quieres, pero era factible. Me explicaré.
"SELECT AVG(col) from <table> GROUP BY <col2> HAVING col2='valor de col2'"
seleccionas la media de la columna col agrupando por la columna col2 y condicionando el resultado final a que col2 = 'valordecol2'. Como agrupa por col2, todos los registros tendran col2 por lo que puedes luego condicionar mediante HAVING, aunque creo que de manera equivocada. De hecho, creo que el group by tendría que haberse hecho por col y no por col2.
HAVING se usa sobre todo para condicionar resultados de funciones agrupadas, es decir, si tú quisieras buscar de esas medias, una media en concreto.
A ti te parecía que funcionaba, pero creo que no era así, o al menos no era la mejor manera de encontrar lo que querías.
Pero cuando quisiste añadir otra condición a la busqueda, el error fue mayor. Si agrupas por col2, col3 no puedes luego pedir que te encuentre valores de col2 and col3 por separado, porque el having busca tras la agrupación y la agrupación une en uno col2 y col3 cuando hay coincidencia, es decir, al agrupar une los col2 que tienen el mismo valor con los col3 de distinto valor que cuentan con el mismo col2 en el registro.

SELECT AVG(col) from <table> GROUP BY <col2>,<col3> HAVING col2='valor de col2' AND col3<'valor de col3

Debes saber bien cuándo usar where y cuando having, y cuándo usar where y having juntos. No es difícil.

Imagínate que sólo quieres encontrar las medias de la columna col cuando la col2 > 8 y la col3 < 9, pero sólo las medias de col superiores a 8
SELECT AVG(col) media FROM tabla WHERE col2 > 8 AND col3 < 9 HAVING media > 8

Espero no haberte liado más y no haber dicho ninguna tontería.
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 02:03.