You are on page 1of 15

Módulo 9

Agrupación y Agregación de datos


Temas

• Uso de funciones agregadas


• Uso de la cláusula GROUP BY
• Filtrar grupos con HAVING
Lección 1: Uso de funciones agregadas

• Trabajando con funciones agregadas


• Funciones agregadas integradas
• Uso de DISTINCT con funciones agregadas
• Usar funciones agregadas con NULL
• Demostración: uso de funciones agregadas
Trabajando con funciones agregadas

• Funciones agregadas:
• Devuelve un valor escalar (sin nombre de columna)
• Ignorar NULL excepto en COUNT (*)
• Puede ser utilizado en
• Cláusulas SELECT, HAVING y ORDER BY
• Frecuentemente utilizado con la cláusula GROUP BY

SELECT AVG(unitprice) AS avg_price,


MIN(qty)AS min_qty,
MAX(discount) AS max_discount
FROM Sales.OrderDetails;

avg_price min_qty max_discount


--------- ------- ------------
26.2185 1 0.250
Funciones agregadas integradas

Comunes Estadisticas Otras

• SUM • STDEV • CHECKSUM_AGG


• MIN • STDEVP • GROUPING
• MAX • VAR • GROUPING_ID
• AVG • VARP
• COUNT
• COUNT_BIG
Uso de DISTINCT con funciones agregadas

• Use DISTINCT con funciones agregadas para


resumir solo valores únicos
• Los agregados DISTINCT eliminan valores
duplicados, no filas (a diferencia de SELECT
DISTINCT)
• Comparar (con resultados parciales):
SELECT empid, YEAR(orderdate) AS orderyear,
COUNT(custid) AS all_custs,
COUNT(DISTINCT custid) AS unique_custs
FROM Sales.Orders
GROUP BY empid, YEAR(orderdate);

empid orderyear all_custs unique_custs


----------- ----------- ----------- ------------
1 2006 26 22
1 2007 55 40
1 2008 42 32
2 2006 16 15
Usar funciones agregadas con NULL

• La mayoría de las funciones agregadas ignoran


NULL
• COUNT (<columna>) ignora NULL
• COUNT (*) cuenta todas las filas

• NULL puede producir resultados incorrectos


(como el uso de AVG)
• Use ISNULL o COALESCE para reemplazar
NULLs antes de agregar
SELECT
AVG(c2) AS AvgWithNULLs,
AVG(COALESCE(c2,0)) AS AvgWithNULLReplace
FROM dbo.t2;
Lección 2: Uso de la cláusula GROUP BY

• Uso de la cláusula GROUP BY


• GROUP BY y el orden lógico de operaciones
• GRUPO POR flujo de trabajo
• Uso de GROUP BY con funciones agregadas
• Demostración: utilizando GROUP BY
Uso de la cláusula GROUP BY

• GROUP BY crea grupos para filas de salida, de acuerdo


con una combinación única de valores especificada en
la cláusula GROUP BY
SELECT <select_list>
FROM <table_source>
WHERE <search_condition>
GROUP BY <group_by_list>;

• GROUP BY calcula un valor de resumen para funciones


agregadas en fases posteriores
SELECT empid, COUNT(*) AS cnt
FROM Sales.Orders
GROUP BY empid;

• Las filas de detalles se "pierden" después de procesar


la cláusula GROUP BY
GROUP BY y el orden lógico de operaciones
Logical Order Phase Comments
5 SELECT
1 FROM
2 WHERE
3 GROUP BY Creates groups
4 HAVING Operates on groups
6 ORDER BY

• Si una consulta usa GROUP BY, todas las fases subsiguientes


operan en los grupos, no en las filas fuente
• HAVING, SELECT y ORDER BY deben devolver un único valor por
grupo
• Todas las columnas en SELECT, HAVING y ORDER BY deben
aparecer en la cláusula GROUP BY o ser entradas para agregar
expresiones
Flujo de Trabajo del GROUP BY

SELECT orderid, empid, custid


FROM Sales.Orders; orderid empid custid
10643 6 1
orderid empid custid
10692 4 1
10643 6 1
10926 4 2
10692 4 1
10625 3 2
10926 4 2
10625 3 2
WHERE custid IN(1,2)
10365 3 3
GROUP BY empid

empid COUNT(*)
6 1
4 2
3 1
Uso de GROUP BY con funciones agregadas

• Las funciones de agregado se usan


comúnmente en la cláusula SELECT, se
resumen por grupo:
SELECT custid, COUNT(*) AS cnt
FROM Sales.Orders
GROUP BY custid;

• Las funciones de agregado pueden hacer


referencia a cualquier columna, no solo a
aquellas en la cláusula GROUP BY
SELECT productid, MAX(qty) AS largest_order
FROM Sales.OrderDetails
GROUP BY productid;
Lección 3: Filtrar grupos con HAVING

• Filtrar datos agrupados utilizando la cláusula


HAVING
• Compare TENIENDO A DONDE
• Demostración: Filtrar grupos con TENER
Filtrar datos agrupados utilizando la cláusula
HAVING

• La cláusula HAVING proporciona una


condición de búsqueda que cada grupo debe
satisfacer
• La cláusula HAVING se procesa después de
GROUP BY
SELECT custid, COUNT(*) AS count_orders
FROM Sales.Orders
GROUP BY custid
HAVING COUNT(*) > 10;
Comparar HAVING con WHERE
• Usar una expresión COUNT (*) en la cláusula HAVING es útil
para resolver problemas comerciales comunes:
• Mostrar solo clientes que hayan realizado más de un pedido:

SELECT c.custid, COUNT(*) AS cnt


FROM Sales.Customers AS c
JOIN Sales.Orders AS o ON c.custid = o.custid
GROUP BY c.custid
HAVING COUNT(*) > 1;

• Mostrar solo productos que aparecen en 10 o más pedidos:


SELECT p.productid, COUNT(*) AS cnt
FROM Production.Products AS p JOIN Sales.OrderDetails AS od ON
p.productid = od.productid
GROUP BY p.productid
HAVING COUNT(*) >= 10;

You might also like