¿Cómo uso T-SQL Group By?
-
08-06-2019 - |
Pregunta
Sé que necesito tener (aunque no sé por qué) un GROUP BY
cláusula al final de una consulta SQL que utiliza funciones agregadas como count
, sum
, avg
, etc:
SELECT count(userID), userName
FROM users
GROUP BY userName
¿Cuándo más lo haría? GROUP BY
¿Sería útil y cuáles son las ramificaciones en el rendimiento?
Solución
Para recuperar la cantidad de widgets de cada categoría de widgets que tenga más de 5 widgets, puede hacer esto:
SELECT WidgetCategory, count(*)
FROM Widgets
GROUP BY WidgetCategory
HAVING count(*) > 5
La cláusula "tener" es algo que la gente a menudo olvida, y en lugar de eso optan por recuperar todos sus datos para el cliente y recorrerlos allí.
Otros consejos
GROUP BY es similar a DISTINCT en que agrupa varios registros en uno.
Este ejemplo, tomado de http://www.devguru.com/technologies/t-sql/7080.asp, enumera productos distintos en la tabla Productos.
SELECT Product FROM Products GROUP BY Product
Product
-------------
Desktop
Laptop
Mouse
Network Card
Hard Drive
Software
Book
Accessory
La ventaja de GROUP BY sobre DISTINCT es que puede brindarle un control granular cuando se usa con una cláusula HAVING.
SELECT Product, count(Product) as ProdCnt
FROM Products
GROUP BY Product
HAVING count(Product) > 2
Product ProdCnt
--------------------
Desktop 10
Laptop 5
Mouse 3
Network Card 9
Software 6
Agrupar por obliga a completar todo el conjunto antes de que se devuelvan los registros (ya que es una clasificación implícita).
Por esa razón (y muchas otras), nunca utilice Agrupar por en una subconsulta.
Contar el número de veces que se utilizan etiquetas podría ser un ejemplo de Google:
SELECT TagName, Count(*)
AS TimesUsed
FROM Tags
GROUP BY TagName ORDER TimesUsed
Si simplemente desea un valor distinto de etiquetas, preferiría usar el DISTINCT
declaración.
SELECT DISTINCT TagName
FROM Tags
ORDER BY TagName ASC
GROUP BY también ayuda cuando desea generar un informe que promedie o sume una gran cantidad de datos.Puede AGRUPAR por ID de departamento y SUMAR todos los ingresos por ventas o PROMEDIO del recuento de ventas de cada mes.