definicion - having sum sql
SQL-teniendo VS donde (7)
La cláusula WHERE se puede usar con las sentencias SELECT, INSERT y UPDATE, mientras que HAVING se puede usar solo con la instrucción SELECT.
WHERE filtra las filas antes de la agregación (GROUP BY), mientras que TENIENDO grupos de filtros después de las agregaciones.
La función de agregado no se puede usar en la cláusula WHERE a menos que esté en una subconsulta contenida en la cláusula HAVING, mientras que las funciones agregadas se pueden usar en la cláusula HAVING.
Tengo dos mesas:
1. Lecturers (LectID, Fname, Lname, degree).
2. Lecturers_Specialization (LectID, Expertise).
Quiero encontrar el profesor con más Especialización. Cuando intento esto, no funciona:
SELECT
L.LectID,
Fname,
Lname
FROM Lecturers L,
Lecturers_Specialization S
WHERE L.LectID = S.LectID
AND COUNT(S.Expertise) >= ALL (SELECT
COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID);
Pero cuando pruebo esto, funciona:
SELECT
L.LectID,
Fname,
Lname
FROM Lecturers L,
Lecturers_Specialization S
WHERE L.LectID = S.LectID
GROUP BY L.LectID,
Fname,
Lname
HAVING COUNT(S.Expertise) >= ALL (SELECT
COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID);
¿Cual es la razon? Gracias.
1. Podemos usar la función agregada con la cláusula HAVING no mediante la cláusula WHERE, por ejemplo, mín., Máx., Prom.
2. WHERE cláusula elimina la tupla de registro por tupla HAVING cláusula elimina todo el grupo de la colección de grupo
En su mayoría HAVING se utiliza cuando tiene grupos de datos y WHERE se usa cuando tiene datos en filas.
No puede usar la cláusula where con funciones agregadas porque cuando obtiene registros en función de la condición, va al registro de la tabla por registro y luego obtiene el registro en función de la condición que le hemos dado. Entonces, ese momento no podemos donde la cláusula. Si bien tener cláusula funciona en el conjunto de resultados que finalmente obtenemos después de ejecutar una consulta.
Consulta de ejemplo:
select empName, sum(Bonus)
from employees
order by empName
having sum(Bonus) > 5000;
Esto almacenará el conjunto de resultados en una memoria temporal, y luego la cláusula realizará su trabajo. Entonces, podemos usar fácilmente las funciones agregadas aquí.
No vi un ejemplo de ambos en una consulta. Entonces este ejemplo podría ayudar.
/**
INTERNATIONAL_ORDERS - table of orders by company by location by day
companyId, country, city, total, date
**/
SELECT country, city, sum(total) totalCityOrders
FROM INTERNATIONAL_ORDERS with (nolock)
WHERE companyId = 884501253109
GROUP BY country, city
HAVING country = ''MX''
ORDER BY sum(total) DESC
Esto filtra la tabla primero por companyId, luego la agrupa (por país y ciudad) y adicionalmente la filtra a solo agregaciones de la ciudad de México. La empresaId no era necesaria en la agregación, pero pudimos usar DONDE filtrar solo las filas que queríamos antes de usar GROUP BY.
Primero debemos conocer el orden de ejecución de las cláusulas, es decir, DESDE> DÓNDE> AGRUPAR POR> TENER> DISTINCIÓN> SELECCIONAR> ORDEN POR. Como la cláusula WHERE se ejecuta antes que la cláusula GROUP BY, los registros no pueden filtrarse aplicando WHERE a los registros aplicados GROUP BY .
"HAVING es igual que la cláusula WHERE pero se aplica en registros agrupados".
primero, la cláusula WHERE obtiene los registros en función de la condición, luego la cláusula GROUP BY los agrupa en consecuencia y luego la cláusula HAVING recupera los registros del grupo en función de la condición de tener.
HAVING
opera en agregados. Como COUNT
es una función agregada, no puede usarla en una cláusula WHERE
.
Here''s algunas lecturas de MSDN sobre funciones agregadas.
WHERE
cláusula WHERE
introduce una condición en filas individuales ; HAVING
cláusula HAVING
introduce una condición en las agregaciones , es decir, los resultados de la selección donde un solo resultado, como recuento, promedio, mínimo, máximo o suma, se ha producido a partir de varias filas. Su consulta requiere un segundo tipo de condición (es decir, una condición en una agregación), por lo que HAVING
funciona correctamente.
Como regla general, use WHERE
antes de GROUP BY
y HAVING
after GROUP BY
. Es una regla bastante primitiva, pero es útil en más del 90% de los casos.
Mientras lo hace, puede volver a escribir su consulta utilizando la versión ANSI de la unión:
SELECT L.LectID, Fname, Lname
FROM Lecturers L
JOIN Lecturers_Specialization S ON L.LectID=S.LectID
GROUP BY L.LectID, Fname, Lname
HAVING COUNT(S.Expertise)>=ALL
(SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID)
Esto eliminaría WHERE
se usó como condición de unión theta .