Ya sé que para muchos esto es básico, pero yo personalmente tuve problemas viendo el valor de usar un HAVING en lugar de un WHERE y ahora que me queda más claro, pues creo que podría ser valioso para alguien allá afuera el conocer mi experiencia, así que ahí va.
WHERE es una condición utilizada con T-SQL, esta siempre aplica a la fila y HAVING es una clausula que siempre aplica a la fila sumarizada(debe ser usada con group by).
WHERE puede ser usada para agregar una condición en la sentencia SELECT o también puede ser usada con una funcion de una sola fila. En este caso deberias tener que especificar el WHERE antes de la clausula GROUP BY.
Por otro lado, la clausula HAVING es usada para agregar una condición sobre el GROUP BY y se supone debe ser usada despues de la clausula GROUP BY
Ademas, la clausula HAVING puede ser usada en la sentencia SELECT con la clausula GROUP BY e incluso cuando GROUP BY no esta presente, en estos casos HAVING funcionará como WHERE.
Ya en la práctica podemos hacer lo siguiente para entenderlo mejor, primero creamos la tabla y segundo le agregamos algunos datos dummy
CREATE TABLE BlogCount
(
BloggerName VARCHAR(10),
Topic VARCHAR(15),
[Year] INT,
Total INT
)INSERT INTO BlogCount VALUES(‘Ritesh’,’SQL’,2005,10)
INSERT INTO BlogCount VALUES(‘Ritesh’,’SQL’,2006,17)
INSERT INTO BlogCount VALUES(‘Ritesh’,’SQL’,2007,124)
INSERT INTO BlogCount VALUES(‘Ritesh’,’SQL’,2008,124)
INSERT INTO BlogCount VALUES(‘Ritesh’,’.NET’,2008,24)
INSERT INTO BlogCount VALUES(‘Alka’,’SQL’,2007,14)
INSERT INTO BlogCount VALUES(‘Alka’,’.NET’,2007,18)
INSERT INTO BlogCount VALUES(‘Alka’,’SQL’,2008,14)
Ya que tenemos datos para trabajar, lo mejor será copiar y pegar la siguiente sentencia en tu vista de SQL Server Management Studio
SELECT * FROM blogcount WHERE Topic=’SQL’
obteniendo
BloggerName Topic Year Total
Ritesh SQL 2005 10
Ritesh SQL 2006 17
Ritesh SQL 2007 124
Ritesh SQL 2008 124
Alka SQL 2007 14
Alka SQL 2008 14SELECT BloggerName,AVG(total) AS ‘Average’ FROM blogcount WHERE Topic=’SQL’ GROUP BY BloggerName
Si toda la información fue creada correctamente, entonces obtendremos algo como lo que sigue, que es agrupar por el campo BloggerName y sacando el promedio de la columna Total cuando Topi = ‘SQL’
BloggerName Average
Alka 14
Ritesh 68SELECT BloggerName,AVG(total) AS ‘Average’ FROM blogcount WHERE Topic=’SQL’ GROUP BY BloggerName HAVING AVG(total)>25
Al agregarle el HAVING AVG(total)>25, estamos aplicando un nuevo filtro tras haber obtenido el conjunto anterior, logrando entonces tener lo siguiente
BloggerName Average
Ritesh 68
Espero les sirva para entender estas dos clausulas… tan parecidas y tan diferentes.
Pingback: SQL Server – Usando Where y Having « DbRunas – Noticias y Recursos sobre Bases de Datos