Compartir a través de


SELECT : cláusula GROUP BY (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de SQL Analytics en Microsoft FabricAlmacén en Microsoft FabricBase de datos SQL en Microsoft Fabric

Cláusula SELECT de instrucción que divide el resultado de la consulta en grupos de filas, normalmente realizando una o varias agregaciones en cada grupo. La SELECT instrucción devuelve una fila para cada grupo.

Syntax

Convenciones de sintaxis de Transact-SQL

Sintaxis compatible con ISO para SQL Server y Azure SQL Database:

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 ] )

Sintaxis no compatible con ISO para SQL Server y Azure SQL Database (solo compatibilidad con versiones anteriores):

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

Sintaxis para Azure Synapse Analytics:

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

Sintaxis para Analytics Platform System (PDW):

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

Arguments

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 FROM cláusula de la SELECT instrucción , pero no es necesario que aparezca en la SELECT lista.

Para conocer las expresiones válidas, vea Expresiones.

La columna debe aparecer en la FROM cláusula de la SELECT instrucción , pero no es necesario que aparezca en la SELECT lista. Sin embargo, debe incluir cada columna de tabla o vista en la GROUP BY lista si la usa en cualquier expresión no deaggregate de la <select> lista.

Opciones DE GROUP BY

Las siguientes opciones amplían la cláusula básica GROUP BY para admitir la agregación jerárquica, el resumen multidimensional, las combinaciones de agrupación personalizadas y los comportamientos de ejecución específicos de la plataforma. Las consultas pueden usar estas opciones para generar subtotales y totales generales en una sola operación lógica.

  • ROLLUP ( <group_by_expression> [ , ... n ] )

    Genera subtotales jerárquicos para las columnas enumeradas y un total general final (por ejemplo, (a,b,c), (a,b), (a), ()). Úselo para informes detallados, comoel mestrimestre del>año>.

  • CUBE ( <group_by_expression> [ , ... n ] )

    Genera todas las combinaciones de las columnas especificadas (la red completa de 2^n) más el total general. Úselo para el análisis multidimensional en cada segmento.

  • GROUPING SETS ( <grouping_set> [ , ... n ] )

    Define las agrupaciones exactas que se van a calcular (incluido () el total general) en un pase. Esta opción es funcionalmente similar a una UNION ALL de varias GROUP BY consultas, pero optimizadas juntas.

  • () (conjunto de agrupación vacío)

    Abreviada para calcular solo el total general en todas las filas. Úselo solo como GROUP BY () o dentro de GROUPING SETS.

  • ALL column-expression [ , ... n ](no ISO; compatibilidad con versiones anteriores)

    Abreviada para agrupar por todos los elementos de selección no agregados. Retenido por compatibilidad; La disponibilidad y la semántica varían.

  • column-expression [ , ... n ] WITH { CUBE | 'ROLLUP }(legacy form)

    Sintaxis anterior que no es ISO equivalente a GROUP BY CUBE(...) o GROUP BY ROLLUP(...). Se admite únicamente por compatibilidad con versiones anteriores. Use las subclases ISO siempre que sea posible.

  • WITH (DISTRIBUTED_AGG)

    Sugiere la ejecución distribuida de agregaciones al agrupar por una sola columna. Los grupos de SQL dedicados de Azure Synapse Analytics y analytics Platform System (PDW) son las únicas plataformas que admiten esta opción.

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

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

Por ejemplo, esta consulta crea una Sales tabla con columnas para Region, Territoryy Sales. Inserta cuatro filas y dos de las filas tienen valores coincidentes para Region y Territory.

CREATE TABLE Sales
(
    Region VARCHAR (50),
    Territory VARCHAR (50),
    Sales INT
);
GO

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 Sales tabla contiene estas filas:

Region Territorios Sales
Canada Alberta 100
Canada Columbia Británica 200
Canada Columbia Británica 300
United States Montana 100

Esta siguiente consulta agrupa Region y Territory devuelve la suma agregada para cada combinación de valores.

SELECT Region,
       Territory,
       SUM(sales) AS TotalSales
FROM Sales
GROUP BY Region, Territory;

El resultado de la consulta tiene tres filas, ya que hay tres combinaciones de valores para Region y Territory. Para TotalSales Canadá y Columbia Británica es la suma de dos filas.

Region Territorios TotalSales
Canada Alberta 100
Canada Columbia Británica 500
United States Montana 100

La expresión de columna de GROUP BY no puede contener:

  • Alias de columna que se define en la SELECT lista. Puede usar un alias de columna para una tabla derivada definida en la FROM cláusula .
  • Una columna de tipo text, ntext o image. Sin embargo, puede usar una columna de texto, ntext o imagen como argumento para una función que devuelve un valor de un tipo de datos válido. Por ejemplo, la expresión puede usar SUBSTRING() y CAST(). Esta regla también se aplica a las expresiones de la HAVING cláusula .
  • Métodos de tipo de datos xml. Puede incluir una función definida por el usuario que usa métodos de tipo de datos xml . Puede incluir una columna calculada que usa métodos de tipo de datos xml .
  • Una subconsulta. La consulta devuelve el error 144.
  • Una columna de una vista indexada.

Están permitidas las siguientes instrucciones:

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 se permiten las siguientes instrucciones:

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

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

GROUP BY ROLLUP ()

Crea un grupo para cada combinación de expresiones de columna. Además, acumula los resultados en subtotales y totales generales. Cuando crea los grupos, se mueve de derecha a izquierda, lo que reduce el número de expresiones de columna para agrupar y agregaciones.

El orden de columna afecta a la ROLLUP salida 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, NULO, NULO, NULO
  • NULL, NULL, NULL, NULL (El grupo con los NULL valores es el total general)

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

SELECT Region,
       Territory,
       SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ROLLUP(Region, Territory);

El resultado de la consulta tiene las mismas agregaciones que el básico GROUP BY sin ROLLUP. Además, crea subtotales para cada valor de Region. Por último, proporciona un total general para todas las filas. El resultado tiene el aspecto siguiente:

Region Territorios TotalSales
Canada Alberta 100
Canada Columbia Británica 500
Canada NULL 600
United States Montana 100
United States 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), los resultados tienen grupos para valores únicos de (a, b), (NULL, b), (a, NULL)y (NULL, NULL).

Con la tabla de los ejemplos anteriores, este código ejecuta una GROUP BY CUBE operación en Region y Territory.

SELECT Region,
       Territory,
       SUM(Sales) AS TotalSales
FROM Sales
GROUP BY CUBE(Region, Territory);

El resultado de la consulta tiene grupos para valores únicos de (Region, Territory), (NULL, Territory), (Region, NULL)y (NULL, NULL). El resultado tiene el aspecto siguiente:

Region Territorios TotalSales
Canada Alberta 100
NULL Alberta 100
Canada Columbia Británica 500
NULL Columbia Británica 500
United States Montana 100
NULL Montana 100
NULL NULL 700
Canada NULL 600
United States NULL 100

AGRUPAR POR CONJUNTOS DE AGRUPACIÓN ()

La GROUPING SETS opción combina varias GROUP BY cláusulas en una GROUP BY cláusula. Los resultados son los mismos que usar UNION ALL en los grupos especificados.

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

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

SELECT Region,
       Territory,
       SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS(ROLLUP(Region, Territory), CUBE(Region, Territory));

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

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

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

Compatibilidad con las características ISO y ANSI SQL-2006 GROUP BY

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

  • Los conjuntos de agrupación no se permiten en la GROUP BY cláusula a menos que formen parte de una lista explícita GROUPING SETS . Por ejemplo, GROUP BY Column1, (Column2, ...ColumnN) se permite 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 semánticamente. Estas cláusulas son semánticamente equivalentes al ejemplo anterior GROUP BY . Esta restricción evita la posibilidad de que GROUP BY Column1, (Column2, ...ColumnN) se pueda malinterpretar como GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)), que no son semánticamente equivalentes.

  • 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 permite GROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn) o GROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn)), que son semánticamente equivalentes al primer GROUP BY ejemplo y tienen una sintaxis más clara.

GRUPO POR ()

Especifica el grupo vacío que genera el total general. Este grupo es útil como uno de los elementos de .GROUPING SET Por ejemplo, esta instrucción proporciona el total de ventas de cada región y, a continuación, proporciona el total general para todas las regiones.

SELECT Region,
       SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS(Region, ());

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

Aplica a: SQL Server y Azure SQL Database

Note

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

Especifica si se deben incluir todos los grupos en los resultados, independientemente de si cumplen los criterios de búsqueda de la WHERE cláusula . Los grupos que no cumplen los criterios de búsqueda tienen NULL para la agregación.

GROUP BY ALL:

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

Compatibilidad con las características ISO y ANSI SQL-2006 GROUP BY

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

  • Solo puede usar GROUP BY ALL y GROUP BY DISTINCT en una cláusula básica GROUP BY que contenga expresiones de columna. No se pueden usar con las GROUPING SETSconstrucciones , ROLLUP, CUBE, WITH CUBEo WITH ROLLUP . ALL es el valor predeterminado y es implícito. Solo puede usarlo en la sintaxis compatible con versiones anteriores.

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

Aplica a: SQL Server y Azure SQL Database

Note

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

CON (DISTRIBUTED_AGG)

Se aplica a: Azure Synapse Analytics and Analytics Platform System (PDW)

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

Note

La DISTRIBUTED_AGG sugerencia de consulta proporciona compatibilidad con versiones anteriores de Analytics Platform System (PDW) y no mejora 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.

Observaciones

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

SELECT list:

  • Agregados vectoriales. Si incluye funciones de agregado en la SELECT lista, GROUP BY calcula un valor de resumen para cada grupo. Estas funciones se conocen como agregados vectoriales.
  • Agregados distintos. Los agregados AVG(DISTINCT <column_name>), COUNT(DISTINCT <column_name>)y SUM(DISTINCT <column_name>) funcionan con ROLLUP, CUBEy GROUPING SETS.

Cláusula WHERE:

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

Cláusula HAVING:

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

Cláusula ORDER BY:

  • Use la ORDER BY cláusula para ordenar el conjunto de resultados. La GROUP BY cláusula no ordena el conjunto de resultados.

NULL valores:

  • Si una columna de agrupación contiene NULL valores, el motor de base de datos trata todos los NULL valores como iguales y los recopila en un único grupo.

Limitaciones

Se aplica a: SQL Server y Azure Synapse Analytics

Para una GROUP BY cláusula que usa ROLLUP, CUBEo 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 porque la GROUP BY cláusula tiene más de 4096 grupos.

  • En el ejemplo siguiente se generan 4097 (212 + 1) conjuntos de agrupación y, a continuación, se produce un error.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b)
    
  • En el ejemplo siguiente se generan 4097 (212 + 1) grupos y, a continuación, se produce 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.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), ())
    
  • En este ejemplo se usa la sintaxis compatible con versiones anteriores. Genera 8 192 (213) conjuntos de agrupación y, a continuación, produce un error.

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

    Para las cláusulas compatibles GROUP BY con versiones anteriores que no contienen CUBE o ROLLUP, los GROUP BY tamaños de columna, las columnas agregadas y los valores agregados implicados en la consulta limitan el número de GROUP BY elementos. Este límite se origina en el límite de 8060 bytes en la tabla de trabajo intermedia que contiene los resultados intermedios de la consulta. Puede usar un máximo de 12 expresiones de agrupación al especificar CUBE o ROLLUP.

Comparación de las características de GROUP BY admitidas

En la tabla siguiente se describen las GROUP BY características que admiten distintos productos.

Feature SQL Server Integration Services SQL Server 1
DISTINCT agregados No se admite para WITH CUBE o WITH ROLLUP. Compatible con WITH CUBE, WITH ROLLUP, GROUPING SETS, CUBEo ROLLUP.
Función definida por el usuario con CUBE o ROLLUP nombre en la GROUP BY cláusula Se permite la función dbo.cube(<arg1>, ...<argN>) definida por el usuario o dbo.rollup(<arg1>, ...<argN>) en la GROUP BY cláusula .

Por ejemplo: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);
No se permite la función dbo.cube (<arg1>, ...<argN>) definida por el usuario o dbo.rollup(<arg1>, ...<argN>) en la GROUP BY cláusula .

Por ejemplo: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);

SQL Server devuelve un mensaje de error 2.

Para evitar este problema, reemplace dbo.cube por [dbo].[cube] o dbo.rollup por [dbo].[rollup].

Se admite el siguiente ejemplo: SELECT SUM (x) FROM T GROUP BY [dbo].[cube](y);.
GROUPING SETS No está soportado Supported
CUBE No está soportado Supported
ROLLUP No está soportado Supported
Total general, como GROUP BY() No está soportado Supported
GROUPING_ID Función No está soportado Supported
GROUPING Función Supported Supported
WITH CUBE Supported Supported
WITH ROLLUP Supported Supported
WITH CUBE o WITH ROLLUP eliminación de agrupación "duplicada" Supported Supported

1 Nivelde compatibilidad de base de datos 100 y versiones posteriores.

2 El mensaje de error devuelto es: Incorrect syntax near the keyword 'cube'|'rollup'.

Examples

Los ejemplos de código de este artículo usan la base de datos de ejemplo de AdventureWorks2025 o AdventureWorksDW2025, que puede descargar de la página principal de Ejemplos de Microsoft SQL Server y proyectos de comunidad.

A. Uso de una cláusula GROUP BY básica

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

SELECT SalesOrderID,
       SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail 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.

SELECT a.City,
       COUNT(bea.AddressID) AS EmployeeCount
FROM Person.BusinessEntityAddress AS bea
     INNER JOIN Person.Address AS a
         ON bea.AddressID = a.AddressID
GROUP BY a.City
ORDER BY a.City;

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 incluir la misma expresión en la SELECT lista y GROUP BY la cláusula .

SELECT DATEPART(yyyy, OrderDate) AS N'Year',
       SUM(TotalDue) AS N'Total Order Amount'
FROM Sales.SalesOrderHeader
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 HAVING cláusula para especificar qué grupos generados en la GROUP BY cláusula se deben incluir en el conjunto de resultados.

SELECT DATEPART(yyyy, OrderDate) AS N'Year',
       SUM(TotalDue) AS N'Total Order Amount'
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy, OrderDate)
HAVING DATEPART(yyyy, OrderDate) >= N'2003'
ORDER BY DATEPART(yyyy, OrderDate);

Ejemplos: Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)

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. La consulta devuelve una fila que contiene la suma de todas las ventas de cada día.

-- 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 que el dispositivo ordene la tabla en la CustomerKey columna antes de realizar la agregación.

-- 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 de selección no tiene agregaciones, debe incluir cada columna en la lista de selección de la GROUP BY lista. Puede incluir columnas calculadas en la lista de selección, pero no es necesario incluirlas en la GROUP BY lista. Estos ejemplos muestran instrucciones sintácticasmente válidas SELECT :

-- 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 AS SalesTax
FROM FactInternetSales
GROUP BY SalesAmount;

SELECT SalesAmount
FROM FactInternetSales
GROUP BY SalesAmount, SalesAmount * 1.10;

H. Uso de una cláusula GROUP BY con varias expresiones GROUP BY

En el ejemplo siguiente se agrupan los resultados mediante varios criterios GROUP BY. Si, dentro de cada OrderDateKey grupo, existen subgrupos que el DueDateKey valor diferencia, la consulta define una nueva agrupación para el conjunto de resultados.

-- Uses AdventureWorks
SELECT OrderDateKey,
       DueDateKey,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey, DueDateKey
ORDER BY OrderDateKey;

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

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

-- Uses AdventureWorks
SELECT OrderDateKey,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
HAVING OrderDateKey > 20040000
ORDER BY OrderDateKey;