
27/12/2008, 07:08
|
Colaborador | | Fecha de Ingreso: marzo-2008 Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 17 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. |