0% encontró este documento útil (0 votos)
10 vistas16 páginas

Uso de GROUP BY en SQL Server

La cláusula GROUP BY divide el resultado de una consulta en grupos de filas según una o más columnas u expresiones, y normalmente realiza agregaciones en cada grupo. Devuelve una fila por grupo. Puede utilizar funciones como ROLLUP y CUBE para generar subtotales y totales generales de los grupos.

Cargado por

echerodrigo
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
10 vistas16 páginas

Uso de GROUP BY en SQL Server

La cláusula GROUP BY divide el resultado de una consulta en grupos de filas según una o más columnas u expresiones, y normalmente realiza agregaciones en cada grupo. Devuelve una fila por grupo. Puede utilizar funciones como ROLLUP y CUBE para generar subtotales y totales generales de los grupos.

Cargado por

echerodrigo
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

27/1/23, 19:29 GROUP BY (Transact-SQL) - SQL Server | Microsoft Learn

SELECT: GROUP BY (Transact-SQL)


Artículo • 14/01/2023 • Tiempo de lectura: 15 minutos

Se aplica a: SQL Server (todas las versiones admitidas) Azure SQL Database


Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform
System (PDW)

Cláusula de la instrucción SELECT que divide el resultado de la consulta en grupos de


filas, normalmente realizando una o varias agregaciones en cada grupo. La instrucción
SELECT devuelve una fila por grupo.

Sintaxis
Convenciones de sintaxis de Transact-SQL

syntaxsql

-- Syntax for SQL Server and Azure SQL Database


-- ISO-Compliant Syntax

GROUP BY {
column-expression
| ROLLUP ( <group_by_expression> [ ,...n ] )
| CUBE ( <group_by_expression> [ ,...n ] )
| GROUPING SETS ( <grouping_set> [ ,...n ] )
| () --calculates the grand total
} [ ,...n ]

<group_by_expression> ::=
column-expression
| ( column-expression [ ,...n ] )

<grouping_set> ::=
() --calculates the grand total
| <grouping_set_item>
| ( <grouping_set_item> [ ,...n ] )

<grouping_set_item> ::=
<group_by_expression>
| ROLLUP ( <group_by_expression> [ ,...n ] )
| CUBE ( <group_by_expression> [ ,...n ] )

-- For backward compatibility only.


-- Non-ISO-Compliant Syntax for SQL Server and Azure SQL Database

GROUP BY {
ALL column-expression [ ,...n ]

[Link] 1/16
27/1/23, 19:29 GROUP BY (Transact-SQL) - SQL Server | Microsoft Learn

| column-expression [ ,...n ] WITH { CUBE | ROLLUP }


}

syntaxsql

-- Syntax for Azure Synapse Analytics

GROUP BY {
column-name [ WITH (DISTRIBUTED_AGG) ]
| column-expression
| ROLLUP ( <group_by_expression> [ ,...n ] )
} [ ,...n ]

syntaxsql

-- Syntax for Parallel Data Warehouse

GROUP BY {
column-name [ WITH (DISTRIBUTED_AGG) ]
| column-expression
} [ ,...n ]

7 Nota

Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores,


consulte Versiones anteriores de la documentación.

Argumentos

column-expression
Especifica una columna o un cálculo no agregado en una columna. Esta columna puede
pertenecer a una tabla, una tabla derivada o una vista. La columna debe aparecer en la
cláusula FROM de la instrucción SELECT, pero no es necesario que aparezca en la lista
SELECT.

Para conocer las expresiones válidas, vea Expresiones.

La columna debe aparecer en la cláusula FROM de la instrucción SELECT, pero no es


necesario que aparezca en la lista SELECT. Aun así, deben incluirse en la lista GROUP BY

[Link] 2/16
27/1/23, 19:29 GROUP BY (Transact-SQL) - SQL Server | Microsoft Learn

todas las columnas de la tabla o la vista de cualquier expresión no agregada de la lista


de <select>:

Están permitidas las siguientes instrucciones:

SQL

SELECT ColumnA, ColumnB FROM T GROUP BY ColumnA, ColumnB;


SELECT ColumnA + ColumnB FROM T GROUP BY ColumnA, ColumnB;
SELECT ColumnA + ColumnB FROM T GROUP BY ColumnA + ColumnB;
SELECT ColumnA + ColumnB + constant FROM T GROUP BY ColumnA, ColumnB;

No están permitidas las siguientes instrucciones:

SQL

SELECT ColumnA, ColumnB FROM T GROUP BY ColumnA + ColumnB;


SELECT ColumnA + constant + ColumnB FROM T GROUP BY ColumnA + ColumnB;

La expresión de columna no puede contener:

Un alias de columna que esté definido en la lista SELECT. Puede usar un alias de
columna para una tabla derivada que esté definida en la cláusula FROM.
Una columna de tipo text, ntext o image. Aun así, puede usar una columna de
tipo text, ntext o image como argumento para una función que devuelva un valor
de un tipo de datos válido. Por ejemplo, la expresión puede usar SUBSTRING() y
CAST(). Esto también se aplica a las expresiones de la cláusula HAVING.
Métodos de tipo de datos xml. Puede incluir una función definida por el usuario
que use métodos de tipo de datos xml. Puede incluir una columna calculada que
use métodos de tipo de datos xml.
Una subconsulta. Se devuelve el error 144.
Una columna de una vista indexada.

GROUP BY column-expression [ ,...n ]


Agrupa los resultados de la instrucción SELECT según los valores en una lista con una o
varias expresiones de columna.

Por ejemplo, esta consulta crea una tabla de ventas con columnas para el país, la región
y las ventas. Inserta cuatro filas, y dos de las filas tienen valores coincidentes para el país
y la región.

SQL

[Link] 3/16
27/1/23, 19:29 GROUP BY (Transact-SQL) - SQL Server | Microsoft Learn

CREATE TABLE Sales ( Country VARCHAR(50), Region VARCHAR(50), Sales INT );

INSERT INTO sales VALUES (N'Canada', N'Alberta', 100);


INSERT INTO sales VALUES (N'Canada', N'British Columbia', 200);
INSERT INTO sales VALUES (N'Canada', N'British Columbia', 300);
INSERT INTO sales VALUES (N'United States', N'Montana', 100);

La tabla de ventas contiene estas filas:

Country Region Sales

Canadá Alberta 100

Canadá Columbia Británica 200

Canadá Columbia Británica 300

Estados Unidos Montana 100

La siguiente consulta agrupa el país y la región y devuelve la suma de agregados de


cada combinación de valores.

SQL

SELECT Country, Region, SUM(sales) AS TotalSales


FROM Sales
GROUP BY Country, Region;

El resultado de la consulta tiene tres filas, ya que hay tres combinaciones de valores
para el país y la región. El valor de las ventas totales para Canadá y Columbia Británica
es la suma de dos filas.

Country Region Ventas totales

Canadá Alberta 100

Canadá Columbia Británica 500

Estados Unidos Montana 100

GROUP BY ROLLUP
Crea un grupo para cada combinación de expresiones de columna. Además, "acumula"
los resultados en subtotales y totales generales. Para ello, mueve de derecha a izquierda
reduciendo el número de expresiones de columna para las que crea grupos y
agregaciones.
[Link] 4/16
27/1/23, 19:29 GROUP BY (Transact-SQL) - SQL Server | Microsoft Learn

El orden de las columnas afecta a la salida de ROLLUP y puede afectar al número de


filas del conjunto de resultados.

Por ejemplo, GROUP BY ROLLUP (col1, col2, col3, col4) crea grupos para cada
combinación de expresiones de columna en las listas siguientes.

col1, col2, col3, col4


col1, col2, col3, NULL
col1, col2, NULL, NULL
col1, NULL, NULL, NULL
NULL, NULL, NULL, NULL (este es el total general)

Con la tabla del ejemplo anterior, este código ejecuta una operación GROUP BY
ROLLUP en lugar de una operación GROUP BY simple.

SQL

SELECT Country, Region, SUM(Sales) AS TotalSales


FROM Sales
GROUP BY ROLLUP (Country, Region);

El resultado de la consulta tiene las mismas agregaciones que la operación GROUP BY


simple sin ROLLUP. Además, crea subtotales para cada valor de país. Por último,
proporciona un total general para todas las filas. El resultado tiene el aspecto siguiente:

Country Region Ventas totales

Canadá Alberta 100

Canadá Columbia Británica 500

Canadá NULL 600

Estados Unidos Montana 100

Estados Unidos NULL 100

NULL NULL 700

GROUP BY CUBE ( )
GROUP BY CUBE crea grupos para todas las combinaciones posibles de columnas. Para
GROUP BY CUBE (a, b), el resultado tiene grupos de valores únicos de (a, b), (NULL, b),
(a, NULL) y (NULL, NULL).

[Link] 5/16
27/1/23, 19:29 GROUP BY (Transact-SQL) - SQL Server | Microsoft Learn

Con la tabla de los ejemplos anteriores, este código ejecuta una operación GROUP BY
CUBE en el país y la región.

SQL

SELECT Country, Region, SUM(Sales) AS TotalSales


FROM Sales
GROUP BY CUBE (Country, Region);

El resultado de la consulta tiene grupos para valores únicos de (Country, Region),


(NULL, Region), (Country, NULL) y (NULL, NULL). El resultado tiene el aspecto siguiente:

Country Region Ventas totales

Canadá Alberta 100

NULL Alberta 100

Canadá Columbia Británica 500

NULL Columbia Británica 500

Estados Unidos Montana 100

NULL Montana 100

NULL NULL 700

Canadá NULL 600

Estados Unidos NULL 100

GROUP BY GROUPING SETS ( )


La opción GROUPING SETS permite combinar varias cláusulas GROUP BY en una
cláusula GROUP BY. Los resultados son equivalentes a usar la instrucción UNION ALL en
los grupos especificados.

Por ejemplo, GROUP BY ROLLUP (Country, Region) y GROUP BY GROUPING SETS ( ROLLUP
(Country, Region) ) devuelven los mismos resultados.

Cuando GROUPING SETS tiene dos o más elementos, los resultados son la unión de los
elementos. En este ejemplo se devuelve la unión de los resultados ROLLUP y CUBE para
el país y la región.

SQL

[Link] 6/16
27/1/23, 19:29 GROUP BY (Transact-SQL) - SQL Server | Microsoft Learn

SELECT Country, Region, SUM(Sales) AS TotalSales


FROM Sales
GROUP BY GROUPING SETS ( ROLLUP (Country, Region), CUBE (Country, Region) );

Los resultados son los mismos que los de esta consulta que devuelve la unión de las
dos instrucciones GROUP BY.

SQL

SELECT Country, Region, SUM(Sales) AS TotalSales


FROM Sales
GROUP BY ROLLUP (Country, Region)
UNION ALL
SELECT Country, Region, SUM(Sales) AS TotalSales
FROM Sales
GROUP BY CUBE (Country, Region);

SQL no consolida los grupos duplicados generados para una lista GROUPING SETS. Por
ejemplo, en GROUP BY ( (), CUBE (Country, Region) ) , ambos elementos devuelven
una fila para el total general y ambas filas se mostrarán en los resultados.

GROUP BY ()
Especifica el grupo vacío que genera el total general. Esto resulta útil como uno de los
elementos de GROUPING SET. Por ejemplo, esta instrucción proporciona el total de
ventas de cada país/región y, después, el total general para todos los países/regiones.

SQL

SELECT Country, SUM(Sales) AS TotalSales


FROM Sales
GROUP BY GROUPING SETS ( Country, () );

GROUP BY ALL column-expression [ ,...n ]


Se aplica a: SQL Server y Azure SQL Database

7 Nota

Esta sintaxis se proporciona únicamente por motivos de compatibilidad con


versiones anteriores. Se quitará en una versión futura. Evite usar esta sintaxis en

[Link] 7/16
27/1/23, 19:29 GROUP BY (Transact-SQL) - SQL Server | Microsoft Learn

nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que


actualmente la usan.

Especifica que se incluyen todos los grupos en los resultados independientemente de


que cumplan los criterios de búsqueda en la cláusula WHERE. Los grupos que no
cumplen los criterios de búsqueda tienen el valor NULL para la agregación.

GROUP BY ALL:

No se admite en consultas que tienen acceso a tablas remotas si también hay una
cláusula WHERE en la consulta.
Generará un error en las columnas que tengan el atributo FILESTREAM.

GROUP BY column-expression [ ,...n ] WITH { CUBE |


ROLLUP }
Se aplica a: SQL Server y Azure SQL Database

7 Nota

Esta sintaxis se proporciona únicamente por motivos de compatibilidad con


versiones anteriores. Evite usar esta sintaxis en nuevos trabajos de desarrollo y
tenga previsto modificar las aplicaciones que actualmente la usan.

WITH (DISTRIBUTED_AGG)
Se aplica a: Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)

La sugerencia de consulta DISTRIBUTED_AGG obliga al sistema de procesamiento


paralelo masivo (MPP) a redistribuir una tabla en una columna específica antes de
realizar una agregación. Solo una columna de la cláusula GROUP BY puede tener una
sugerencia de consulta DISTRIBUTED_AGG. Una vez finalizada la consulta, se quita la
tabla redistribuida. La tabla original no se cambia.

NOTA: La sugerencia de consulta DISTRIBUTED_AGG se proporciona para ofrecer


compatibilidad con versiones anteriores de Sistema de la plataforma de análisis (PDW) y
no mejorará el rendimiento de la mayoría de las consultas. De forma predeterminada,
MPP redistribuye los datos según sea necesario para mejorar el rendimiento de las
agregaciones.

[Link] 8/16
27/1/23, 19:29 GROUP BY (Transact-SQL) - SQL Server | Microsoft Learn

Notas generales

Cómo interactúa GROUP BY con la instrucción SELECT


Lista SELECT:

Agregados vectoriales. Si se incluyen funciones de agregado en la lista SELECT,


GROUP BY calcula un valor de resumen para cada grupo. Se conocen como
agregados vectoriales.
Agregados distintos. Los agregados AVG (DISTINCT column_name), COUNT
(DISTINCT column_name) y SUM (DISTINCT column_name) se admiten con
ROLLUP, CUBE, and GROUPING SETS.

Cláusula WHERE:

SQL quita las filas que no cumplen las condiciones especificadas en la cláusula
WHERE antes de realizar ninguna operación de agrupación.

Cláusula HAVING:

SQL usa la cláusula HAVING para filtrar los grupos en el conjunto de resultados.

Cláusula ORDER BY:

En su lugar, use la cláusula ORDER BY para ordenarlo. La cláusula GROUP BY no


ordena el conjunto de resultados.

Valores NULL:

Si una columna de agrupamiento contiene valores NULL, todos ellos se consideran


equivalentes y se recopilan en un solo grupo.

Limitaciones y restricciones
Se aplica a: SQL Server (a partir de la versión 2008) y Azure Synapse Analytics

Capacidad máxima
Para una cláusula GROUP BY que usa ROLLUP, CUBE o GROUPING SETS, el número
máximo de expresiones es 32. El número máximo de grupos es 4096 (212). En los
ejemplos siguientes se produce un error debido a que la cláusula GROUP BY tiene más
de 4096 grupos.

[Link] 9/16
27/1/23, 19:29 GROUP BY (Transact-SQL) - SQL Server | Microsoft Learn

En el ejemplo siguiente se generan 4097 (212 + 1) conjuntos de agrupamiento y se


producirá un error.

SQL

GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b )

En el ejemplo siguiente se generan 4097 (212 + 1) grupos y se producirá un error.


Los conjuntos de agrupación CUBE () y () generan una fila de total general, y los
conjuntos de agrupación duplicados no se eliminan.

SQL

GROUP BY GROUPING SETS( CUBE(a1, ..., a12), ())

En este ejemplo se usa sintaxis compatible con versiones anteriores. Se generan se


generan 8192 (213) conjuntos de agrupamiento y se producirá un error.

SQL

GROUP BY CUBE (a1, ..., a13)


GROUP BY a1, ..., a13 WITH CUBE

En las cláusulas GROUP BY compatibles con versiones anteriores que no


contengan CUBE o ROLLUP, el número de grupos por elementos está limitado por
los tamaños de columna de GROUP BY, las columnas de agregado y los valores de
agregado que participan en la consulta. Este límite procede del límite de 8.060
bytes de la tabla de trabajo intermedia que se necesita para contener los
resultados intermedios de la consulta. Se permite un máximo de 12 expresiones
de agrupamiento cuando se especifica CUBE o ROLLUP.

Compatibilidad con las características GROUP BY de ISO y


ANSI SQL-2006
La cláusula GROUP BY admite todas las características GROUP BY incluidas en el
estándar SQL-2006 con las excepciones de sintaxis siguientes:

Los conjuntos de agrupamiento no se pueden usar en la cláusula GROUP BY, a


menos que formen parte de una lista GROUPING SETS explícita. Por ejemplo,
GROUP BY Column1, (Column2, ...ColumnN ) se admite en el estándar, pero no en

Transact-SQL. Transact-SQL admite GROUP BY C1, GROUPING SETS ((Column2,


...ColumnN)) y GROUP BY Column1, Column2, ... ColumnN , que son equivalentes

[Link] 10/16
27/1/23, 19:29 GROUP BY (Transact-SQL) - SQL Server | Microsoft Learn

semánticamente. Éstos son equivalentes semánticamente al ejemplo de GROUP BY


anterior. Con ello se evita la posibilidad de que GROUP BY Column1, (Column2,
...ColumnN ) se pueda malinterpretar como GROUP BY C1, GROUPING SETS
((Column2, ...ColumnN)) , que no son equivalentes semánticamente.

No se pueden usar conjuntos de agrupamiento dentro de conjuntos de


agrupamiento. Por ejemplo, GROUP BY GROUPING SETS (A1, A2,...An, GROUPING
SETS (C1, C2, ...Cn)) se admite en el estándar SQL-2006, pero no en Transact-

SQL. Transact-SQL admite GROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn
) o GROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn) ) , que

son equivalentes semánticamente al primer ejemplo de GROUP BY y tienen una


sintaxis más clara.

GROUP BY [ALL/DISTINCT] solo se permite en una cláusula GROUP BY simple que


contenga expresiones de columna. No se permite con las construcciones
GROUPING SETS, ROLLUP, CUBE, WITH CUBE o WITH ROLLUP. ALL es el valor
predeterminado y es implícito. Solo se permite en sintaxis compatible con
versiones anteriores.

Comparación de las características GROUP BY


compatibles
En la tabla siguiente se describen las características de GROUP BY que son compatibles
en función de las versiones de SQL y del nivel de compatibilidad de la base de datos.

Característica SQL Server Nivel de SQL Server 2008 o


Integration Services compatibilidad 100 o posterior con el nivel
superior con SQL de compatibilidad 90.
Server

Agregados No se admite en WITH Se admite en WITH Igual que el nivel de


DISTINCT CUBE ni en WITH CUBE, WITH ROLLUP, compatibilidad 100.
ROLLUP. GROUPING SETS, CUBE
o ROLLUP.

Función Se admite la función No se admite la función Se admite la función


definida por el definida por el usuario definida por el usuario definida por el usuario
usuario con un [Link](arg1,...argN) [Link] [Link] (arg1,...argN)
nombre CUBE o o [Link](arg1, (arg1,...argN**)** o o
ROLLUP en la ...argN) en la cláusula [Link](arg1,...argN) [Link](arg1,...argN)
cláusula GROUP BY. en la cláusula GROUP en la cláusula GROUP
GROUP BY BY. BY.
Por ejemplo: SELECT
Por ejemplo: SELECT SUM Por ejemplo: SELECT SUM

[Link] 11/16
27/1/23, 19:29 GROUP BY (Transact-SQL) - SQL Server | Microsoft Learn

Característica SQL Server Nivel de SQL Server 2008 o


Integration Services compatibilidad 100 o posterior con el nivel
superior con SQL de compatibilidad 90.
Server

SUM (x) FROM T GROUP (x) FROM T GROUP BY (x) FROM T GROUP BY
BY [Link](y); [Link](y); [Link](y);

Se devuelve el mensaje
de error siguiente:
"Sintaxis incorrecta cerca
de la palabra clave
'cube'|'rollup'."

Para evitar este


problema, reemplace
[Link] por [dbo].
[cube] o [Link] por
[dbo].[rollup] .

Se admite el siguiente
ejemplo: SELECT SUM (x)
FROM T GROUP BY [dbo].
[cube](y); .

GROUPING No compatible Compatible Compatible


SETS

CUBE No compatible Compatible No compatible

ROLLUP No compatible Compatible No compatible

Total general, No compatible Compatible Compatible


como GROUP
BY ()

GROUPING_ID, No compatible Compatible Compatible


función

GROUPING, Compatible Compatible Compatible


función

WITH CUBE Compatible Compatible Compatible

WITH ROLLUP Compatible Compatible Compatible

Eliminación de Compatible Compatible Compatible


grupos
duplicados de

[Link] 12/16
27/1/23, 19:29 GROUP BY (Transact-SQL) - SQL Server | Microsoft Learn

Característica SQL Server Nivel de SQL Server 2008 o


Integration Services compatibilidad 100 o posterior con el nivel
superior con SQL de compatibilidad 90.
Server

WITH CUBE o
WITH ROLLUP

Ejemplos

A. Usar una cláusula GROUP BY simple


En el ejemplo siguiente se recupera el total de cada SalesOrderID de la tabla
SalesOrderDetail . En este ejemplo se usa AdventureWorks.

SQL

SELECT SalesOrderID, SUM(LineTotal) AS SubTotal


FROM [Link] AS sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID;

B. Usar una cláusula GROUP BY con varias tablas


En el ejemplo siguiente se recupera el número de empleados de cada City de la tabla
Address combinada con la tabla EmployeeAddress . En este ejemplo se usa

AdventureWorks.

SQL

SELECT [Link], COUNT([Link]) EmployeeCount


FROM [Link] AS bea
INNER JOIN [Link] AS a
ON [Link] = [Link]
GROUP BY [Link]
ORDER BY [Link];

C. Usar una cláusula GROUP BY con una expresión


En el ejemplo siguiente se recuperan las ventas totales de cada año con la función
DATEPART . Debe incluirse la misma expresión en la lista SELECT y en la cláusula GROUP
BY .

[Link] 13/16
27/1/23, 19:29 GROUP BY (Transact-SQL) - SQL Server | Microsoft Learn

SQL

SELECT DATEPART(yyyy,OrderDate) AS N'Year'


,SUM(TotalDue) AS N'Total Order Amount'
FROM [Link]
GROUP BY DATEPART(yyyy,OrderDate)
ORDER BY DATEPART(yyyy,OrderDate);

D. Usar una cláusula GROUP BY con una cláusula HAVING


En el ejemplo siguiente se usa la cláusula HAVING para especificar cuáles de los grupos
generados en la cláusula GROUP BY deben incluirse en el conjunto de resultados.

SQL

SELECT DATEPART(yyyy,OrderDate) AS N'Year'


,SUM(TotalDue) AS N'Total Order Amount'
FROM [Link]
GROUP BY DATEPART(yyyy,OrderDate)
HAVING DATEPART(yyyy,OrderDate) >= N'2003'
ORDER BY DATEPART(yyyy,OrderDate);

Ejemplos: Azure Synapse Analytics y


Almacenamiento de datos en paralelo

E. Uso básico de la cláusula GROUP BY


En el ejemplo siguiente se busca la cantidad total de todas las ventas de cada día. Se
devuelve para cada día una fila que contiene la suma de todas las ventas.

SQL

-- Uses AdventureWorksDW

SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales FROM FactInternetSales


GROUP BY OrderDateKey ORDER BY OrderDateKey;

F. Uso básico de la sugerencia DISTRIBUTED_AGG


En este ejemplo se usa la sugerencia de consulta DISTRIBUTED_AGG para forzar a que el
dispositivo ordene la tabla en la columna CustomerKey antes de realizar la agregación.

[Link] 14/16
27/1/23, 19:29 GROUP BY (Transact-SQL) - SQL Server | Microsoft Learn

SQL

-- Uses AdventureWorksDW

SELECT CustomerKey, SUM(SalesAmount) AS sas


FROM FactInternetSales
GROUP BY CustomerKey WITH (DISTRIBUTED_AGG)
ORDER BY CustomerKey DESC;

G. Variaciones de sintaxis para GROUP BY


Cuando la lista SELECT no tiene agregaciones, todas las columnas de la lista SELECT
deben incluirse en la lista GROUP BY. Las columnas calculadas de la lista SELECT pueden
mostrarse en la lista GROUP BY, pero no son necesarias. Estos son algunos ejemplos de
instrucciones SELECT correctas sintácticamente:

SQL

-- Uses AdventureWorks

SELECT LastName, FirstName FROM DimCustomer GROUP BY LastName, FirstName;


SELECT NumberCarsOwned FROM DimCustomer GROUP BY YearlyIncome,
NumberCarsOwned;
SELECT (SalesAmount + TaxAmt + Freight) AS TotalCost FROM FactInternetSales
GROUP BY SalesAmount, TaxAmt, Freight;
SELECT SalesAmount, SalesAmount*1.10 SalesTax FROM FactInternetSales GROUP
BY SalesAmount;
SELECT SalesAmount FROM FactInternetSales GROUP BY SalesAmount,
SalesAmount*1.10;

H. Usar GROUP BY con varias expresiones GROUP BY


En el ejemplo siguiente se agrupan los resultados mediante varios criterios GROUP BY . Si
dentro de cada grupo OrderDateKey hay subgrupos que se pueden diferenciar mediante
DueDateKey , se definirá una nueva agrupación para el conjunto de resultados.

SQL

-- Uses AdventureWorks

SELECT OrderDateKey, DueDateKey, SUM(SalesAmount) AS TotalSales


FROM FactInternetSales
GROUP BY OrderDateKey, DueDateKey
ORDER BY OrderDateKey;

[Link] 15/16
27/1/23, 19:29 GROUP BY (Transact-SQL) - SQL Server | Microsoft Learn

I. Utilizar una cláusula GROUP BY con una cláusula


HAVING
En el ejemplo siguiente se usa la cláusula HAVING para especificar los grupos generados
en la cláusula GROUP BY que deben incluirse en el conjunto de resultados. Solo se
incluirán en los resultados los grupos con fechas de pedido de 2004 o años posteriores.

SQL

-- Uses AdventureWorks

SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales


FROM FactInternetSales
GROUP BY OrderDateKey
HAVING OrderDateKey > 20040000
ORDER BY OrderDateKey;

Consulte también
GROUPING_ID (Transact-SQL)
GROUPING (Transact-SQL)
SELECT (Transact-SQL)
SELECT (cláusula de Transact-SQL)

[Link] 16/16

También podría gustarte