Requisito previo: cláusula WHERE , GROUP BY , cláusula Have vs Where Las cláusulas
Where y Group By se utilizan para filtrar las filas devueltas por la consulta en función de la condición. Las diferencias son las siguientes a continuación.
La cláusula WHERE especifica las condiciones de búsqueda para las filas devueltas por Query y limita las filas a un conjunto de filas específico. Si una tabla tiene una gran cantidad de registros y si alguien quiere obtener los registros en particular, es útil usar la cláusula ‘where’.
La cláusula GROUP BY resume filas idénticas en un grupo único/distinto y devuelve una sola fila con el resumen de cada grupo, mediante el uso de la función Agregada adecuada en la lista SELECT, como COUNT(), SUM(), MIN(), MAX() , PROMEDIO(), etc
Caso de uso:
Supongamos que una empresa de ventas desea obtener una lista de los Clientes que compraron cierta cantidad de artículos el año pasado, para poder venderles más cosas este año.
Hay una tabla llamada SalesOrder con columnas CustomerId, SalesOrderId, Order_Date, OrderNumber, OrderItem, UnitPrice, OrderQty
Ahora necesitamos obtener los clientes que hicieron pedidos el año pasado, es decir, 2017
Uso de la cláusula Where –
SELECT * FROM [Sales].[Orders] WHERE Order_Date >= '2017-01-01 00:00:00.000' AND Order_Date < '2018-01-01 00:00:00.000'
Esto devolverá el conjunto de filas con todos los Clientes y los Pedidos correspondientes del año 2017.
Uso de la cláusula Group By –
SELECT CustomerID, COUNT(*) AS OrderNumbers FROM [Sales].[Orders] WHERE Order_Date >= '2017-01-01 00:00:00.000' AND Order_Date < '2018-01-01 00:00:00.000' GROUP BY CustomerId
Esto devolverá el conjunto de filas de los Clientes (CustomerId) que realizaron pedidos en el año 2017 y el recuento total de pedidos realizados por cada Cliente.
Uso de la cláusula Tener:
la cláusula Tener se usa para filtrar valores en la cláusula Agrupar por. La siguiente consulta filtra algunas de las filas
SELECT SalesOrderID, SUM(UnitPrice* OrderQty) AS TotalPrice FROM Sales.SalesOrderDetail GROUP BY SalesOrderID HAVING TotalPrice > 5000
Dado que la visibilidad de la cláusula WHERE es una fila a la vez, no hay forma de que evalúe el SUM en todos los SalesOrderID. La cláusula HAVING se evalúa después de crear la agrupación.
También puede usar la cláusula ‘Dónde’ con la cláusula ‘Tener’. La cláusula WHERE se aplica primero a las filas individuales de las tablas. Solo se agrupan las filas que cumplen las condiciones de la cláusula WHERE. A continuación, se aplica la cláusula HAVING a las filas del conjunto de resultados.
Ejemplo:
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPrice FROM Sales.SalesOrderDetail WHERE SalesOrderID > 500 GROUP BY SalesOrderID HAVING SUM(UnitPrice * OrderQty) > 10000
Así que aquí, la cláusula que tiene se aplicará en las filas que están filtradas por la cláusula where. Tener una cláusula solo puede comparar resultados de funciones agregadas o parte de la columna del grupo.
Conclusión:
- WHERE se utiliza para filtrar registros antes de que se realicen agrupaciones en filas individuales .
- GROUP BY agrega/agrupa las filas y devuelve el resumen de cada grupo .
- HAVING se usa para filtrar valores después de que hayan sido grupos .