Está en la página 1de 28

19/4/2017 Agrupación y Ventanilla

Página 1

Capítulo 5

Agrupación y Ventanilla

Objetivos del examen en este capítulo:

S Trabajar con datos
S Consulta de datos mediante instrucciones SELECT.
S Implementar sub­consultas.
S Implementar consultas agregadas.

E ste capítulo se centra en las operaciones de análisis de datos. Una función de análisis de datos es una función
Aplicado a un conjunto de filas, y devuelve un solo valor. Un ejemplo de tal función es
La función SUM agregada. Una función de análisis de datos puede ser una función de grupo o una
Función de ventana. Los dos tipos difieren en cómo se define el conjunto de filas para la función
Para operar. Puede utilizar consultas agrupadas para definir tablas agrupadas y, a continuación, un grupo
Se aplica a cada grupo. O bien, puede utilizar consultas en ventanas que definen las ventanas
Tablas y, a continuación, se aplica una función de ventana a cada ventana.
Las lecciones de este capítulo cubren las consultas agrupadas y el pivotamiento y el no intercambio de datos.
El pivoteo puede considerarse una forma especializada de agrupación, y el
El inverso de la rotación. Este capítulo también cubre las consultas con ventanas.

Lecciones en este capítulo:

S Lección 1: Escribir consultas agrupadas
S Lección 2: Cómo girar y separar datos
S Lección 3: Uso de las funciones de ventana

antes de que empieces

Para completar las lecciones de este capítulo, debe tener:
S Experimente trabajar con Microsoft SQL Server Management Studio (SSMS).
S Alguna experiencia escribiendo código T­SQL.
S Una comprensión de cómo combinar conjuntos.
S Acceso a una instancia de SQL Server 2012 con la base de datos de ejemplo instalada TSQL2012.

149

Página 2
Lección 1: Escribir consultas agrupadas

Puede utilizar consultas agrupadas para definir grupos en sus datos y, a continuación,
Análisis por grupo. Agrupar los datos por un conjunto de atributos conocido como un grupo­
ing conjunto. Las consultas T­SQL tradicionales definen un único conjunto de agrupación; A saber, agrupan los datos en
Solo un camino. Más recientemente, T­SQL introdujo soporte para funciones que le permiten definir
Conjuntos de agrupación múltiples en una consulta. Esta lección comienza cubriendo las consultas que definen una
Agrupar y, a continuación, cubre las consultas que definen varios.

Después de esta lección, usted será capaz de:
S Agrupe datos utilizando un solo conjunto de agrupación.
S Utilice las funciones de grupo.
https://translate.googleusercontent.com/translate_f 1/28
19/4/2017 Agrupación y Ventanilla
S Agrupe datos utilizando varios conjuntos de agrupación.
Tiempo estimado de lección: 60 minutos

Trabajar con un conjunto de agrupación único
Con las consultas agrupadas, puede organizar las filas que está consultando en grupos y aplicar datos
Análisis como funciones agregadas contra esos grupos. Una consulta se convierte en una
Consulta agrupada cuando utiliza una función de grupo, una cláusula GROUP BY o ambas.
Una consulta que invoca una función de grupo pero no tiene una cláusula GROUP BY explícita ar­
Varía todas las filas de un grupo. Considere la siguiente consulta como un ejemplo.
USE TSQL2012;
SELECT COUNT (*) Numeros AS
FROM Sales.Orders;
Esta consulta genera la siguiente salida.
Números
­­­­­­­­­­­
830
Como no hay ninguna cláusula GROUP BY explícita, todas las filas consultadas desde la tabla Sales.Orders
Se organizan en un grupo y, a continuación, la función COUNT (*) cuenta el número de filas en
Ese grupo. Las consultas agrupadas devuelven una fila de resultados por grupo y, debido a que la consulta define
Sólo un grupo, devuelve sólo una fila en el conjunto de resultados.

150 Capítulo 5 Agrupación y Ventanilla

Página 3
Utilizando una cláusula GROUP BY explícita, puede agrupar las filas en función de un grupo­
Conjunto de expresiones. Por ejemplo, la consulta siguiente agrupa las filas por ID del remitente y
Cuenta el número de filas (órdenes, en este caso) por cada grupo distinto.
SELECT shipperid, COUNT (*) Numeradores AS
DESDE Ventas.
GRUPO POR shipperid;
Esta consulta genera la siguiente salida.
Numeradores shipperid
Unesdoc.unesco.org unesdoc.unesco.org
1 249
2 326
3 255
La consulta identifica tres grupos porque hay tres identificadores distintos de remitentes.
El conjunto de agrupación puede estar compuesto de múltiples elementos. Por ejemplo, la siguiente consulta
Agrupa las filas por ID del remitente y año enviado.
SELECCIONE shipperid, AÑO (fecha de envío) AS shippedyear,
COUNT (*) números numéricos AS
DESDE Ventas.
GRUPO POR shipperid, YEAR (fecha de envío);
Esta consulta genera la siguiente salida.
Shipperid shippedyear numorders
Unesdoc.unesco.org unesdoc.unesco.org
1 2008 79
3 2008 73
1 NULO 4
3 NULO 6
1 2006 36
2 2007 143
2 NULO 11
3 2006 51
1 2007 130
2 2008 116
2 2006 56
3 2007 125
Tenga en cuenta que obtiene un grupo para cada identificador de remitente y combinación de año enviados
Que existe en los datos, incluso cuando el año enviado es NULL. Recuerde que un NULL en el
La columna shippeddate representa los pedidos no enviados, por lo que un NULL en la columna shippedyear rep­
Resents el grupo de pedidos no enviados para el cargador respectivo.
Si necesita filtrar grupos completos, necesita una opción de filtrado que se evalúa en el
Grupo­a diferencia de la cláusula WHERE, que se evalúa en el nivel de fila. Para ello, T­SQL

https://translate.googleusercontent.com/translate_f 2/28
19/4/2017 Agrupación y Ventanilla
Proporciona la cláusula HAVING. Al igual que la cláusula WHERE, la cláusula HAVING utiliza un predicado pero
Evalúa el predicado por grupo en oposición a por fila. Esto significa que puede referirse a
Agregado porque los datos ya han sido agrupados.

Lección 1: Escribir Agrupados consultas capítulo 5
151

Página 4
Por ejemplo, suponga que sólo necesita agrupar los pedidos enviados por ID del remitente y
Año de envío y filtrar sólo grupos con menos de 100 pedidos. Puede utilizar los siguientes
Consulta para lograr esta tarea.
SELECCIONE shipperid, AÑO (fecha de envío) AS shippedyear,
COUNT (*) números numéricos AS
DESDE Ventas.
WHERE fecha de envío IS NOT NULL
GROUP BY shipperid, YEAR (fecha de envío)
TENIENDO CUENTA (*) <100;
Esta consulta genera la siguiente salida.
Shipperid shippedyear numorders
Unesdoc.unesco.org unesdoc.unesco.org
1 2008 79
3 2008 73
1 2006 36
3 2006 51
2 2006 56
Observe que la consulta filtra sólo los pedidos enviados en la cláusula WHERE. Este filtro se aplica
En el nivel de fila conceptualmente antes de agrupar los datos. A continuación, la consulta agrupa los datos mediante
ID del remitente y año enviado. Entonces, la cláusula HAVING filtra sólo los grupos que tienen un recuento de
Filas (órdenes) que es menor que 100. Finalmente, la cláusula SELECT devuelve el ID del remitente, enviado
Año, y el recuento de pedidos por cada grupo restante.
T­SQL soporta una serie de funciones agregadas. Estos incluyen COUNT (*) y algunos gen­
(Como son categorizadas por SQL estándar) como COUNT, SUM, AVG, MIN y
MAX. Las funciones generales de conjunto se aplican a una expresión e ignoran NULL.
La consulta siguiente invoca la función COUNT (*), además de un número de conjunto general
Funciones, incluyendo COUNT.
SELECCIONE shipperid,
COUNT (*) Numeros AS,
COUNT (shippeddate) COMO los shippedorders,
MIN (fecha de envío) AS firstshipdate,
MAX (fecha de envío) AS lastshipdate,
SUM (val) AS valor total
FROM Sales.OrderValues
GRUPO POR shipperid;
Esta consulta genera la salida siguiente (las fechas se formatean para la legibilidad).
Shipperid numorders shippedorders fecha de nacimiento fecha de caducidad valor total
Unesdoc.unesco.org unesdoc.unesco.org Unesdoc.unesco.org unesdoc.unesco.org
3 255 249 2006­07­15 2008­05­01 383405.53
1 249 245 2006­07­10 2008­05­04 348840.00
2 326 315 2006­07­11 2008­05­06 533547.69

152 Capítulo 5 Agrupación y Ventanilla

Página 5
Observe la diferencia entre los resultados de COUNT (fecha de envío) y COUNT (*). los
Anterior ignora NULL en la columna shippeddate y, por lo tanto, los recuentos son menores que
Iguales a los producidos por estos últimos.
Con las funciones de conjunto, puede trabajar con distintas ocurrencias especificando un DIS­
TINCT antes de la expresión, como sigue.
SELECT shipperid, COUNT (DISTINCT shippeddate) AS numshippingdates
DESDE Ventas.
GRUPO POR shipperid;
Esta consulta genera la siguiente salida.
Shipperid numshippingdates
Unesdoc.unesco.org unesdoc.unesco.org
1 188
2 215
3 198

https://translate.googleusercontent.com/translate_f 3/28
19/4/2017 Agrupación y Ventanilla
Tenga en cuenta que la opción DISTINCT está disponible no sólo para la función COUNT, sino también para
Otras funciones de conjunto. Sin embargo, es más común usarlo con COUNT.
Desde una perspectiva lógica de procesamiento de consultas, la cláusula GROUP BY se evalúa
FROM y WHERE y antes de las cláusulas HAVING, SELECT y ORDER BY. Entonces el
Las tres últimas cláusulas ya funcionan con una tabla agrupada, y por tanto las expresiones que
El apoyo es limitado. Cada grupo está representado por sólo una fila de resultados; Por lo tanto, todas
Las cláusulas que figuran en esas cláusulas deben garantizar un solo valor de resultado por grupo. No hay
Problema que se refiere directamente a los elementos que aparecen en la cláusula GROUP BY porque
Sólo devuelve un valor distinto por grupo. Pero si desea referirse a elementos de
Las tablas subyacentes que no aparecen en la lista GROUP BY, debe aplicar un agregado
Función a ellos. Así es como puede estar seguro de que la expresión sólo devuelve un valor por
grupo. Como ejemplo, la siguiente consulta no es válida.
SELECT S.shipperid, S.companyname, COUNT (*) numéros AS
FROM Sales.Shippers AS S
ÚNETE a Sales.Orders AS O
ON S.shipperid = O.shipperid
GRUPO POR S.shipperid;
Esta consulta genera el error siguiente.
Msg 8120, Nivel 16, Estado 1, Línea 1
Columna 'Sales.Shippers.companyname' no es válida en la lista de selección porque no es
Contenida en una función agregada o en la cláusula GROUP BY.
A pesar de que usted sabe que no puede haber más de un nombre distinto de la empresa por cada uno
Distinto identificador de expedidor, T­SQL no sabe esto. Debido a que la columna S.companyname ni ap­
Perlas en la lista GROUP BY ni está contenido en una función agregada, no está permitido
HAVING, SELECT y ORDER BY.

Lección 1: Escribir Agrupados consultas capítulo 5
153

Página 6
Puede utilizar varias soluciones. Una solución es agregar la columna S.companyname
A la lista GROUP BY, como se indica a continuación.
SELECT S.shipperid, S.companyname,
COUNT (*) números numéricos AS
FROM Sales.Shippers AS S
INNER JOIN Sales.Orders AS O
ON S.shipperid = O.shipperid
GRUPO POR S.shipperid, S.companyname;
Esta consulta genera la siguiente salida.
Shipperid nombre de la compañía numorders
Unesdoc.unesco.org unesdoc.unesco.org
1 Expedidor GVSUA 249
2 Expedidor ETYNR 326
3 Expedidor ZHISN 255
Otra solución es aplicar una función de agregado como MAX a la columna, como se indica a continuación.
SELECT S.shipperid,
MAX (S.companyname) Numeros AS,
COUNT (*) AS shippedorders
FROM Sales.Shippers AS S
INNER JOIN Sales.Orders AS O
ON S.shipperid = O.shipperid
GRUPO POR S.shipperid;
En este caso, la función agregada es artificial porque no puede haber más de
Un nombre de empresa distinto por cada identificador de cargador distinto. La primera solución, sin embargo, tiende
Para producir planes más óptimos, y también parece ser la solución más natural.
La tercera solución consiste en agrupar y agrupar las filas de la tabla Pedidos primero,
Multa una expresión de tabla basada en la consulta agrupada ya continuación, unirse a la expresión de tabla con
La tabla de los cargadores para conseguir los nombres de la compañía del remitente. Aquí está el código de la solución.
Con c
(
SELECT shipperid, COUNT (*) Numeradores AS
DESDE Ventas.
GRUPO POR shipperid
)
SELECT S.shipperid, S.companyname, numorders
FROM Sales.Shippers AS S
INNER JOIN C
ON S.shipperid = C.shipperid;
SQL Server normalmente optimiza la tercera solución como si fuera la primera. La primera solución podría
Ser preferible porque implica mucho menos código.

https://translate.googleusercontent.com/translate_f 4/28
19/4/2017 Agrupación y Ventanilla

154 Capítulo 5 Agrupación y Ventanilla

Página 7
Trabajar con varios grupos de agrupación

Con T­SQL, puede definir varios conjuntos de agrupación en la misma consulta. En otras palabras, puede
Utilice una consulta para agrupar los datos de más de una manera. T­SQL apoya tres cláusulas que al­
Conjuntos de agrupación de grupos de baja definición: GROUPING SETS, CUBE y ROLLUP. Usted los usa en la
Cláusula GROUP BY.
Puede utilizar la cláusula GROUPING SETS para enumerar todos los conjuntos de agrupación que desea definir en
la consulta. Como ejemplo, la siguiente consulta define cuatro conjuntos de agrupación.
SELECT shipperid, YEAR (fecha de envío) AS shipyear, COUNT (*) Numeros AS
DESDE Ventas.
GRUPO POR CONJUNTOS DE GRUPO
(
(Shipperid, YEAR (shippeddate)),
(Shipperid ),
(AÑO (fecha de envío) ),
( )

Usted lista los conjuntos de agrupación separados por comas dentro del par externo de paréntesis be­
Anhelando la cláusula GROUPING SETS. Utilice un par interno de paréntesis para incluir cada
Conjunto de agrupación. Si no indica un par interno de paréntesis, cada elemento individual es
Considerado un conjunto separado de agrupación.
Esta consulta define cuatro conjuntos de agrupación. Uno de ellos es el conjunto de agrupaciones vacías,
Multas de un grupo con todas las filas para el cálculo de grandes agregados. La consulta genera la
Siguiente salida.
Shipperid números del astillero
Unesdoc.unesco.org unesdoc.unesco.org
1 NULO 4
2 NULO 11
3 NULO 6
NULO NULO 21
1 2006 36
2 2006 56
3 2006 51
NULO 2006 143
1 2007 130
2 2007 143
3 2007 125
NULO 2007 398
1 2008 79
2 2008 116
3 2008 73
NULO 2008 268
NULO NULO 830
1 NULO 249
2 NULO 326
3 NULO 255

Lección 1: Escribir Agrupados consultas capítulo 5
155

Página 8
La salida combina los resultados de agrupar y agregar los datos de cuatro
Agrupación de conjuntos. Como se puede ver en la salida, los NULL se utilizan como marcadores de posición en filas donde un
Elemento no es parte del conjunto de agrupación. Por ejemplo, en filas de resultados que están asociadas con la
Grouping set (shipperid), la columna de resultado de shipyear se establece en NULL. Del mismo modo, en filas que son
Asociado con el conjunto de agrupación (YEAR (shippeddate)), la columna shipperid se establece en NULL.
Usted podría conseguir el mismo resultado escribiendo cuatro preguntas agrupadas separadas­cada defin­
Un solo conjunto de agrupación y unificar sus resultados con un operador UNION ALL. Cómo­
Tal solución implicaría mucho más código y no se optimizará tan eficientemente como
La consulta con la cláusula GROUPING SETS.
T­SQL soporta dos cláusulas adicionales llamadas CUBE y ROLLUP, que puede considerar como
Abreviaturas de la cláusula GROUPING SETS. La cláusula CUBE acepta una lista de expresiones como
Y define todos los conjuntos de agrupación posibles que se pueden generar a partir de las entradas,
El conjunto de agrupaciones vacías. Por ejemplo, la siguiente consulta es un equivalente lógico de la
Que usó la cláusula GROUPING SETS.

https://translate.googleusercontent.com/translate_f 5/28
19/4/2017 Agrupación y Ventanilla
SELECT shipperid, YEAR (fecha de envío) AS shipyear, COUNT (*) Numeros AS
DESDE Ventas.
GRUPO POR CUBO (shipperid, AÑO (fecha de envío));
La cláusula CUBE define los cuatro conjuntos de agrupación posibles de las dos entradas:
1. (IdDestinatario, Año (FechaEnvío))
2. (IdDestinatario)
3. (AÑO (FechaEnvío))
4. ()
La cláusula ROLLUP es también una abreviatura de la cláusula GROUPING SETS, pero la usa
Cuando hay una jerarquía formada por los elementos de entrada. En tal caso, sólo un subconjunto de la
Posibles conjuntos de agrupación es realmente interesante. Consideremos, por ejemplo, una jerarquía de
De los elementos de los países de embarque, de los buques y de los buques, en este orden. Solo es interesante rodar
Subir los datos en una dirección, calcular agregados para los siguientes conjuntos de agrupación:
1. (PaísDeEnvío, shipregion, CiudadDestinatario)
2. (PaísDeEnvío, shipregion)
3. (PaísDeEnvío)
4. ()
Los otros conjuntos de agrupación simplemente no son interesantes. Por ejemplo, aunque el mismo
Nombre de la ciudad puede aparecer en diferentes lugares del mundo, no es interesante agregar
Los acontecimientos­independientemente de la región y el país.

156 Capítulo 5 Agrupación y Ventanilla

Página 9
Por lo tanto, cuando los elementos forman una jerarquía, se utiliza la cláusula ROLLUP y de esta manera evitar
Calculando agregados innecesarios. A continuación se muestra un ejemplo de una consulta que utiliza la cláusula ROLLUP
Basado en la jerarquía antes mencionada.
SELECT shipcountry, shipregion, shipcity, COUNT (*) números AS
DESDE Ventas.
GRUPO POR ROLLUP (país de los buques, región de buques, buques);
Esta consulta genera la siguiente salida (mostrada aquí en forma abreviada).
Shipcountry shipregion shipcity Números
­­­­­­­­­­­­­­­ ­­­­­­­­­­­­­­­ ­­­­­­­­­­­­­­­ ­­­­­­
Argentina NULO Buenos Aires 16
Argentina NULO NULO dieciséis
Argentina NULO NULO dieciséis
...
Estados UnidosAlaska Anclaje 10
Estados UnidosAlaska NULO 10
Estados UnidosCalifornia San Francisco 4
Estados UnidosCalifornia NULO 4
Estados UnidosCARNÉ DE IDENTIDAD Boise 31
Estados UnidosCARNÉ DE IDENTIDAD NULO 31
...
Estados UnidosNULO NULO 122
...
NULO NULO NULO 830
Como se mencionó, NULL se utilizan como marcadores de posición cuando un elemento no forma parte del grupo,
Conjunto Si todas las columnas agrupadas rechazan NULL en la tabla subyacente, puede
Filas que están asociadas con un conjunto de agrupación único basado en una combinación única de NULL
Y no­NULLs en esas columnas. Se plantea un problema al identificar las filas que
Con una única agrupación cuando una columna agrupada permite NULL­como es el caso con la
Columna de la región de embarque. ¿Cómo saber si un NULL en el resultado representa un marcador de posición
(Que significa "todas las regiones") o un NULL original de la tabla (que significa "región inaplicable")?
T­SQL proporciona dos funciones para ayudar a resolver este problema: GROUPING y GROUPING_ID.
La función GROUPING acepta un solo elemento como entrada y devuelve 0 cuando el elemento
Es parte del conjunto de agrupación y 1 cuando no lo es. La siguiente consulta demuestra el uso del
Función GROUPING.
SELECCIONAR
Equipo de buque, GROUPING (shipcountry) AS grpcountry,
Shipregion, GRUPO (shipregion) AS grpcountry,
Shipcity, AGRUPAMIENTO (shipcity) AS grpcountry,
COUNT (*) números numéricos AS
DESDE Ventas.
GRUPO POR ROLLUP (país de los buques, región de buques, buques);

https://translate.googleusercontent.com/translate_f 6/28
19/4/2017 Agrupación y Ventanilla

Lección 1: Escribir Agrupados consultas capítulo 5
157

Página 10
Esta consulta genera la siguiente salida (mostrada aquí en forma abreviada).
Shipcountry, shipgrion, grpcountry, shipcity Grpcountry
Números
Unesdoc.unesco.org unesdoc.unesco.org Unesdoc.unesco.org unesdoc.unesco.org
­­­­­
Argentina 0 NULO 0 Buenos Aires 0 dieciséis
Argentina 0 NULO 0 NULO 1 dieciséis
Argentina 0 NULO 1 NULO 1 dieciséis
...
Estados Unidos0 Alaska 0 Anclaje 0 10
Estados Unidos0 Alaska 0 NULO 1 10
Estados Unidos0 California 0 San Francisco 0 4
Estados Unidos0 California 0 NULO 1 4
Estados Unidos0 CARNÉ DE IDENTIDAD
0 Boise 0 31
Estados Unidos0 CARNÉ DE IDENTIDAD
0 NULO 1 31
...
Estados Unidos0 NULO 1 NULO 1 122
...
NULO 1 NULO 1 NULO 1 830
Ahora puede identificar un conjunto de agrupaciones buscando 0s en los elementos que forman parte del
Conjunto de agrupación y 1s en el resto.
Otra función que puede utilizar para identificar los conjuntos de agrupación es GROUPING_ID. Esta
Función acepta la lista de columnas agrupadas como entradas y devuelve un entero que representa a
Mapa de bits El bit más a la derecha representa la entrada más a la derecha. El bit es 0 cuando los respectivos ele­
Parte del conjunto de agrupación y 1 cuando no lo es. Cada bit representa 2 elevado a la potencia
De la posición de bit menos 1; Así que el bit más a la derecha representa 1, el que está a la izquierda de él 2, luego 4,
Entonces 8, y así sucesivamente. El resultado entero es la suma de los valores que representan los elementos que son
No forman parte del conjunto de agrupación porque sus bits están activados. Aquí hay una consulta que demuestra
El uso de esta función.
SELECT GROUPING_ID (shipcountry, shipregion, shipcity) AS grp_id,
Shipcountry, shipregion, shipcity,
COUNT (*) números numéricos AS
DESDE Ventas.
GRUPO POR ROLLUP (país de los buques, región de buques, buques);
Esta consulta genera la siguiente salida (mostrada aquí en forma abreviada).
Grp_id shipcountry shipregion shipcity Números
Unesdoc.unesco.org unesdoc.unesco.org ­­­­
0 Argentina NULO Buenos Aires 16
1 Argentina NULO NULO dieciséis
3 Argentina NULO NULO dieciséis
...
0 Estados UnidosAlaska Anclaje 10
1 Estados UnidosAlaska NULO 10
0 Estados UnidosCalifornia San Francisco 4
1 Estados UnidosCalifornia NULO 4
0 Estados UnidosCARNÉ DE IDENTIDAD
Boise 31
1 Estados UnidosCARNÉ DE IDENTIDAD
NULO 31
...

158 Capítulo 5 Agrupación y Ventanilla

Página 11
3 Estados UnidosNULO NULO 122
...
7 NULO NULO NULO 830
La última fila de esta salida representa el conjunto de agrupación vacía­ninguno de los tres ele­
Es parte del conjunto de agrupaciones. Por lo tanto, los respectivos bits (valores 1, 2 y 4) se giran
en. La suma de los valores que representan esos bits es 7.

TIP conjuntos de agrupación de álgebra
Puede especificar varias cláusulas GROUPING SETS, CUBE y ROLLUP en el grupo BY
Cláusula separada por comas. Al hacerlo, se logra un efecto de multiplicación. Por ejemplo
La cláusula CUBE a, b, c define ocho conjuntos de agrupación y la cláusula ROLLUP x, y, define
Cuatro conjuntos de agrupación. Especificando una coma entre los dos, como en CUBE (a, b, c), ROLLUP (x,
Y,, los multiplicas y obtienes 32 conjuntos de agrupaciones.

https://translate.googleusercontent.com/translate_f 7/28
19/4/2017 Agrupación y Ventanilla
Comprobación rápida
1. ¿Qué hace que una consulta de una consulta agrupada?
2. ¿Cuáles son las cláusulas que se pueden utilizar para definir varios conjuntos de agrupación en el
Misma consulta
Respuesta rápida
1. Cuando se utiliza una función de agregado, un RUPO BY, o ambos.
2. Presenta ROUPIN, CUBE y ROLLUP.

Practicar la escritura Agrupados consultas

En esta práctica, ejercita su conocimiento de las consultas agrupadas. Escribir consultas agrupadas
Que definen un único conjunto de agrupación, además de varios.
Si encuentra un problema al completar un ejercicio, puede instalar los proyectos completados
Desde la carpeta Solución que se proporciona con el contenido complementario de este capítulo y
lección.

ejercicio 1 Información agregada sobre pedidos de clientes
En este ejercicio, agrupa y agrega datos que involucran clientes y pedidos. Cuando se le da una
, Primero trate de encontrar su propia solución de consulta antes de examinar la consulta proporcionada.
1. Abra SSMS y conectarse a la base de datos ejemplo TSQL2012.
2. Escribir una consulta que calcula el número de pedidos por cada cliente para los clientes
de España.

Lección 1: Escribir Agrupados consultas capítulo 5
159

Página 12
Para lograr esta tarea, primero debe unirse a las tablas Sales.Customers y Sales.Orders
Basada en una coincidencia entre el ID de cliente del cliente y el ID de cliente de la orden.
A continuación, sólo filtrar las filas donde el país del cliente es España. Entonces tu grupo
Las filas restantes por ID de cliente. Debido a que hay una columna custid en ambas entradas
Tablas, debe prefijar la columna con el origen de tabla. Por ejemplo, si usted prefiere
Para usar el de la tabla Sales.Customers, y alias que la tabla C, necesita
Especifique C.custid en la cláusula GROUP BY. Finalmente, devuelve el ID de cliente y el
Cuenta de filas en la lista SELECT. Aquí está la consulta completa.
USE TSQL2012;
SELECT C.custid, COUNT (*) números AS
FROM Sales.Customers AS C
INNER JOIN Sales.Orders AS O
ON C.custid = O.custid
DONDE C.Country = N'Spain '
GRUPO POR C.custid;
Esta consulta genera la siguiente salida.
Números de custid
Unesdoc.unesco.org unesdoc.unesco.org
8 3
29 5
30 10
69 5
3. Añadir la información de la ciudad en la salida de la consulta. Primero, intente agregar C.city a
La lista SELECT, como se indica a continuación.
SELECT C.custid, C.city, COUNT (*) Numeradores AS
FROM Sales.Customers AS C
INNER JOIN Sales.Orders AS O
ON C.custid = O.custid
DONDE C.Country = N'Spain '
GRUPO POR C.custid;
Obtiene el siguiente error.
Msg 8120, Nivel 16, Estado 1, Línea 1
Columna 'Sales.Customers.city' no es válida en la lista de selección porque no es
Contenida en una función agregada o en la cláusula GROUP BY.
4. Encontrar una solución que permitiera regresar a la ciudad también.
Una solución posible es agregar ciudad a la cláusula GROUP BY, como sigue.
SELECT C.custid, C.city, COUNT (*) Numeradores AS
FROM Sales.Customers AS C
INNER JOIN Sales.Orders AS O
ON C.custid = O.custid

https://translate.googleusercontent.com/translate_f 8/28
19/4/2017 Agrupación y Ventanilla
GRUPO POR C.custid, C.city;
DONDE C.Country = N'Spain '

160 Capítulo 5 Agrupación y Ventanilla

Página 13
Esta consulta genera la siguiente salida.
Custid city Números
Unesdoc.unesco.org unesdoc.unesco.org
8 Madrid 3
29 Barcelona 5
30 Sevilla 10
69 Madrid 5

Ejercicio 2 Definir varios conjuntos de agrupación
En este ejercicio, se definen varios conjuntos de agrupación.
S Su punto de partida es la consulta que escribió en el paso 4 del ejercicio 1. Además de la
Cuenta por el cliente devuelto por esa consulta, también incluyen en la misma salida el gran
contar. Usted necesita la salida para mostrar primero los recuentos por el cliente y luego el gran
contar.
Puede utilizar la cláusula GROUPING SETS para definir dos conjuntos de agrupación: uno para (C.custid,
C.city), y otro para el conjunto de agrupación vacía (). Para ordenar el número de clientes antes
Los grandes recuentos, ordenar los datos por GROUPING (C.custid). Aquí está la consulta completa.
SELECT C.custid, C.city, COUNT (*) Numeradores AS
FROM Sales.Customers AS C
INNER JOIN Sales.Orders AS O
ON C.custid = O.custid
DONDE C.Country = N'Spain '
GRUPO POR CONJUNTOS DE GRUPO ((C.custid, C.city), ())
ORDEN POR AGRUPACIÓN (C.custid);
Esta consulta genera la siguiente salida.
Custid city Números
Unesdoc.unesco.org unesdoc.unesco.org
8 Madrid 3
29 Barcelona 5
30 Sevilla 10
69 Madrid 5
NULO NULO 23

Resumen de la Lección

S Con T­SQL, puede agrupar sus datos y realizar operaciones de análisis de datos
Grupos.
S Puede aplicar funciones agregadas a los grupos, como COUNT, SUM, AVG, MIN,
Y MAX.
S Las consultas agrupadas tradicionales definen sólo un conjunto de agrupación.
S Puede utilizar funciones más recientes en el idioma para definir varios conjuntos de agrupación en una
Consulta utilizando las cláusulas GROUPING SETS, CUBE y ROLLUP.

Lección 1: Escribir Agrupados consultas capítulo 5
161

Página 14
Revisión de lecciones
Responda las siguientes preguntas para probar su conocimiento de la información de esta lección. Tú
Puede encontrar las respuestas a estas preguntas y explicaciones de por qué cada opción de respuesta es correcta
O incorrecto en la sección "Respuestas" al final de este capítulo.
1. ¿Cuál es la restricción que agrupan consultas imponen a sus expresiones?
a. Si la consulta es una consulta agrupada, debe invocar una función agregada.
B. Si la consulta tiene una función de agregado, debe tener una cláusula GROUP BY.
do. Los elementos de la cláusula GROUP BY también se deben especificar en la cláusula SELECT.
D. Si se refiere a un elemento de las tablas consultadas en el HAVING, SELECT o OR­
Cláusulas DER BY, debe aparecer en la lista GROUP BY o estar contenida
función agregada.
2. ¿Cuál es el propósito de las opciones de agrupamiento y GROUPING_ID? (Elija todo eso
aplicar.)
a. Puede utilizar estas funciones en la cláusula GROUP BY para agrupar datos.

https://translate.googleusercontent.com/translate_f 9/28
19/4/2017 Agrupación y Ventanilla
B. Puede utilizar estas funciones para decir si un nulo en el resultado representa un lugar­
Titular de un elemento que no forma parte del conjunto de agrupación o un
la mesa.
do. Puede utilizar estas funciones para identificar de forma exclusiva el conjunto de agrupaciones que el resultado
Fila está asociada.
D. Estas funciones se pueden utilizar para ordenar los datos sobre la base de conjunto de agrupaciones de asociación que
Es, primer detalle, y luego agregados.
3. ¿Cuál es la diferencia entre el COUNT (*) y de la función de agregado
COUNT (<expresión>) Función de conjunto general?
a. COUNT (*) cuenta las filas; COUNT (<expresión>) cuenta filas donde <expresión> es
no nulo.
B. COUNT (*) cuenta columnas; COUNT (<expresión>) cuenta filas.
do. COUNT (*) devuelve un BIGINT; COUNT (<expresión>) devuelve un INT.
D. No hay ninguna diferencia entre las funciones.

162 Capítulo 5 Agrupación y Ventanilla

Página 15
Lección 2: datos pivotantes y no dinámicos

El pivoteo es un caso especializado de agrupación y agregación de datos. El unívoco es, en cierto sentido,
El inverso del pivotamiento. T­SQL soporta operadores nativos para ambos. La primera parte de esta lección
Describe el pivoteo y la segunda parte describe el no pivotar.

Después de esta lección, usted será capaz de:
S Utilice el operador PIVOT para hacer pivotar los datos.
S Utilice el operador UNPIVOT para omitir datos.
Tiempo estimado de lección: 40 minutos

Datos pivotantes
El pivoteo es una técnica que agrupa y agrega datos, haciendo la transición desde un estado de filas
A un estado de columnas. En todas las consultas de pivote, es necesario identificar tres elementos:
S ¿Qué quieres ver en las filas? Este elemento se conoce como el en filas, o agrupación
elemento.
Llave
S ¿Qué quieres ver en las columnas? Este elemento se conoce como el sobre cols, o spread­
elemento ing.
S ¿Qué desea ver en la intersección de cada valor de fila y columna distintos?
Este elemento se conoce como la de datos, o elemento de agregación.
Como ejemplo de una petición de pivote, suponga que desea consultar la tabla Sales.Orders.
Desea devolver una fila para cada ID de cliente distinto (el elemento de agrupación), una columna para
Cada identificador distinto del remitente (el elemento de dispersión), y en la intersección de cada cliente y
Cargador que desea ver la suma de los valores de carga (el elemento de agregación). Con T­SQL, usted
Puede lograr tal tarea pivotante usando el operador de tabla PIVOT. El formulario recomendado
Para una consulta de pivote es generalmente como el siguiente.
CON PivotData AS
(
SELECCIONAR
<Columna de agrupación>,
<Columna de dispersión>,
<Columna de agregación>
FROM <tabla de origen>
)
SELECT <lista de selección>
FROM PivotData
PIVOT (<función agregada> (<columna de agregación>)
PARA <columna de dispersión> IN (<valores de separación distintos)> AS P;

https://translate.googleusercontent.com/translate_f 10/28
19/4/2017 Agrupación y Ventanilla

Capítulo pivotante y Unpivoting de datos 5: Lección 2
163

Página 16
Esta forma general recomendada se compone de los siguientes elementos:
S Se define una expresión de tabla (como la denominada PivotData) que devuelve los tres
Elementos que están implicados en el giro. No se recomienda consultar el subyacente
Fuente de la tabla directamente; La razón de esto se explica en breve.
S Emitir la consulta externa en contra de la expresión de tabla y aplicar el operador PIVOT
A esa expresión de tabla. El operador PIVOT devuelve un resultado de tabla. Debe asignar
Un alias a esa tabla, por ejemplo, P.
S La especificación para el operador PIVOT comienza indicando una función agregada ap­
Al elemento de agregación­en este ejemplo, SUM (flete).
S Luego se especifica la cláusula FOR seguido de la columna de dispersión, que en este ex­
Amplio es shipperid.
S A continuación, especifique la cláusula IN seguida de la lista de valores distintos que aparecen en la
Elemento separador, separados por comas. Lo que solía ser valores en la propagación
(En este caso, ID de expedidor de casos) se convierten en nombres de columna en la tabla de resultados. Por lo tanto,
Los elementos de la lista deben expresarse como identificadores de columna. Recuerde que si una
El identificador umn es irregular, tiene que ser delimitado. Dado que los identificadores del remitente son enteros,
Tienen que ser delimitadas: [1], [2], [3].
Siguiendo esta sintaxis recomendada para consultas de pivote, la siguiente consulta
Tarea de ejemplo (devolver ID de cliente en filas, ID de remitente en columnas y el
Las intersecciones).
CON PivotData AS
(
SELECCIONAR
Custid, ­ agrupando la columna
Shipperid, ­ columna de distribución
Columna de carga y agregación
DESDE Ventas.
)
SELECT custid, [1], [2], [3]
FROM PivotData
PIVOT (SUMA (carga) PARA shipperid IN ([1], [2], [3])) AS P;
Esta consulta genera la siguiente salida (mostrada aquí en forma abreviada).
Custid 1 2 3
Unesdoc.unesco.org unesdoc.unesco.org
1 95,03 61,02 69,53
2 43,90 NULL 53,52
3 63,09 116,56 88,87
4 41,95 358,54 71,46
5 189,44 1074,51 295,57
6 0,15 126,19 41,92
7 217,96 215,70 190,00
8 16,16 175,01 NULL
9 341,16 419,57 597,14
10 129,42 162,17 502,36
...
(89 fila (s) afectada (s))
164 Capítulo 5 Agrupación y Ventanilla

Página 17
Si observa atentamente las especificaciones del operador PIVOT,
Indican los elementos de agregación y propagación, pero no el elemento de agrupación. El agrupamiento
Elemento se identifica por eliminación­es lo que queda de la tabla consultada además del ag­
Gregación y esparcimiento. Por ello, se recomienda preparar una tabla expresa­
Para el operador pivote devolviendo sólo los tres elementos que deben participar en la
Tarea pivotante. Si consulta la tabla subyacente directamente (Sales.Orders en este caso), todas las columnas
De la tabla además de las columnas de agregación (carga) y propagación (shipperid)
Se convierten en sus elementos de agrupación. Esto incluye incluso el orderid de columna de clave principal.
Así que en lugar de obtener una fila por cliente, terminas recibiendo una fila por pedido. Puedes verlo
Para usted mismo ejecutando el siguiente código.
SELECT custid, [1], [2], [3]
DESDE Ventas.
PIVOT (SUMA (carga) PARA shipperid IN ([1], [2], [3])) AS P;
Esta consulta genera la siguiente salida (mostrada aquí en forma abreviada).
Custid 1 2 3
Unesdoc.unesco.org unesdoc.unesco.org
85 NULL NULL 32.38
79 11.61 NULL NULL

https://translate.googleusercontent.com/translate_f 11/28
19/4/2017 Agrupación y Ventanilla
34 NULL 65.83 NULL
84 41.34 NULL NULL
76 NULL 51.30 NULL
34 NULL 58.17 NULL
14 NULL 22.98 NULL
68 NULL NULL 148.33
88 NULL 13.97 NULL
35 NULL NULL 81.91
...
(830 fila (s) afectada (s))
Obtener 830 filas de nuevo porque hay 830 filas en la tabla Sales.Orders. Definiendo
Una expresión de tabla como se muestra en la solución recomendada, se controlan las columnas
Se utilizarán como columnas de agrupación. Si devuelve custid, shipperid y flete en la tabla
Expresión, y utilizar los dos últimos como elementos de propagación y agregación, respectivamente, el
El operador PIVOT asume implícitamente que custid es el elemento de agrupación. Por lo tanto, agrupa
Los datos por custid, y como resultado, devuelve una sola fila por cliente.
Debe tener en cuenta algunas limitaciones del operador PIVOT:
S Los elementos de agregación y propagación no pueden ser directamente resultados de expresiones;
En su lugar, deben ser nombres de columna de la tabla consultada. Sin embargo, puede aplicar
Expresiones en la consulta que define la expresión de la tabla, asigne alias a las
Siones y, a continuación, utilice los alias del operador PIVOT.
S La función COUNT (*) no está permitida como la función agregada utilizada por el PIVOT
operador. Si necesitas una cuenta, usted tiene que utilizar el escrutinio general (<nombre de col>) agregada
Puerta función. Una solución sencilla es definir una columna ficticia en la tabla expres­
Una constante, como en 1 AS agg_col, y luego en el operador PIVOT aplique la
Agrega a esa columna: COUNT (agg_col).

Capítulo pivotante y Unpivoting de datos 5: Lección 2
165

Página 18

S Un operador PIVOT está limitado a usar una sola función agregada.
S La cláusula IN del operador PIVOT acepta una lista estática de valores de propagación. No lo hace
Soporta una subconsulta como entrada. Usted necesita saber a continuación cuáles son los valores distintos en
La columna de propagación y especificar aquellos en la cláusula IN. Cuando la lista no se conoce
Adelante, puede utilizar SQL dinámico para construir y ejecutar la cadena de consulta después de que­
Los valores distintos de los datos. Para obtener más información sobre el SQL dinámico, consulte el Capítulo 12,
"Implementación de transacciones, gestión de errores y SQL dinámico".

Datos no dinamizadores
Los datos no dinámicos pueden considerarse como la inversa de la rotación. El punto de partida es algunos pivotada
datos. Cuando unpivoting datos, girar los datos de entrada de un estado de columnas a un estado de
Filas Al igual que T­SQL admite el operador tabla dinámica nativa para realizar pivotante, que SUP­
Un operador de puertos UNPIVOT nativa para realizar unpivoting. Como pivote, UNPIVOT es implement­
ed como un operador de mesa que se utiliza en la cláusula FROM. El operador opera en la entrada
tabla que se proporciona a su izquierda, lo que podría ser el resultado de otros operadores de mesa, al igual que se une.
El resultado del operador UNPIVOT es el resultado de mesa que se puede utilizar como entrada a otra
operadores de mesa que aparecen a la derecha.
Para demostrar unpivoting, el uso como un ejemplo una tabla de ejemplo llamados Sales.FreightTotals.
El siguiente código crea los datos de la muestra y lo consulta para mostrar su contenido.
USO TSQL2012;
SI OBJECT_ID ( 'Sales.FreightTotals') no es nulo Sales.FreightTotals DROP TABLE;
IR
CON TAL COMO PivotData
(
SELECCIONAR
custid, ­ agrupar la columna
IdDestinatario, ­ la difusión de la columna
de carga ­ columna agregación
DE Sales.Orders
)
SELECCIONAR *
EN Sales.FreightTotals
DE PivotData
Pivote (SUM (flete) FOR IdDestinatario IN ([1], [2], [3])) AS P;
SELECT * FROM Sales.FreightTotals;
Este código genera el siguiente resultado, que se muestra aquí en forma abreviada.
custid 1 2 3
­­­­­­­ ­­­­­­­­ ­­­­­­­­ ­­­­­­­­
1 95.03 61.02 69.53
2 43.90 53.52 NULL
3 63.09 116.56 88.87
4 41,95 358,54 71,46
5 189,44 1.074,51 295,57
6 0,15 126,19 41,92
7 217,96 215,70 190,00
https://translate.googleusercontent.com/translate_f 12/28
19/4/2017 Agrupación y Ventanilla

166 Capítulo 5 Agrupación y Ventanilla

Página 19
8 16.16 175.01 NULL
9 341,16 419,57 597,14
10 129,42 162,17 502,36
...
Como se puede ver, la tabla de origen tiene una fila para cada cliente y una columna para cada Ship­
por (expedidores 1, 2, y 3). La intersección de cada cliente y el expedidor tiene el total de la carga
valores. La tarea unpivoting a mano es devolver una fila para cada cliente y cargador de retención
el ID de cliente en una columna, el ID de remitente en una segunda columna, y el valor de carga en una
tercera columna.
Unpivoting siempre tiene un conjunto de columnas de origen y gira a los múltiples filas,
la generación de dos columnas de destino: uno para mantener los valores de la columna de origen y otra para sostener
los nombres de columna fuente. Las columnas de origen ya existen, por lo que sus nombres deben ser conocidos
para ti. Pero las dos columnas de destino son creados por la solución unpivoting, por lo que necesita
elegir nombres para ellos. En nuestro ejemplo, las columnas de origen son [1], [2] y [3]. En cuanto a los nombres
para las columnas de destino, es necesario decidir sobre aquellos. En este caso, podría ser adecuado para llamar
la carga de columna y los valores de la columna IdDestinatario nombres. Así que recuerda, en cada unpivoting
tarea, es necesario identificar los tres elementos que intervienen:
S El conjunto de columnas de origen que está unpivoting (en este caso, [1], [2], [3])
S El nombre que desea asignar a la meta de valores de columna (en este caso, flete)
S El nombre que desea asignar a la columna de nombres de destino (en este caso, IdDestinatario)
Después de identificar estos tres elementos, se utiliza el siguiente formulario de consulta para manejar la
unpivoting tarea.
SELECT <lista de columnas>, <columna de nombres>, <columna de valores>
FROM <tabla de origen>
UNPIVOT (<valores de columna> para <nombres de columna> IN (<origen columnas>)) AS U;
Sobre la base de esta sintaxis, la siguiente consulta se dirige a la tarea actual.
custid SELECT, IdDestinatario, carga
DE Sales.FreightTotals
UNPIVOT (flete para IdDestinatario IN ([1], [2], [3])) AS U;
Esta consulta genera la siguiente salida (que se muestra aquí en forma abreviada).
flete custid IdDestinatario
­­­­­­­ ­­­­­­­­­­ ­­­­­­­­
1 1 95.03
1 2 61.02
1 3 69.53
2 1 43.90
2 3 53,52
3 1 63,09
3 2 116.56
3 3 88.87
4 1 41.95
4 2 358,54
4 3 71.46
...

Pivotante y Unpivoting datos: Lección 2 capítulo 5
167

Página 20
Además unpivoting los datos, el operador UNPIVOT filtra las filas con nulos en el valor
columna (carga en este caso). El supuesto es que los representan casos inaplicables. Ahí
había escape de mantener valores NULL en la fuente si la columna era aplicable a al menos una
otro cliente. Pero después de unpivoting los datos, no hay razón para mantener una fila durante un cierto
par cliente­cargador si es aplicable, si eso remitente no envía órdenes a ese cliente.
En términos de tipos de datos, la columna de nombres se define como una cadena de caracteres Unicode (NVAR­
CHAR (128)). La columna de valores se define con el mismo tipo que el tipo de la fuente
columnas que eran no girados. Por esta razón, los tipos de todas las columnas que están unpivoting
debe ser lo mismo.
Cuando haya terminado, ejecute el siguiente código para la limpieza.
SI OBJECT_ID ( 'Sales.FreightTotals') no es nulo Sales.FreightTotals DROP TABLE;

Comprobación rápida
1. ¿Cuál es la diferencia entre el pivote y UNPIVOT?
2. ¿Qué tipo de construcciones del lenguaje son pivote y UNPIVOT implementado como?
Comprobar respuesta rápida

https://translate.googleusercontent.com/translate_f 13/28
19/4/2017 Agrupación y Ventanilla
1. PIVOT gira datos de un estado de filas a un estado de columnas; gira UNPIVOT
los datos de las columnas a filas.
2. pivote y UNPIVOT se implementan como operadores de mesa.

La práctica de giro de Datos

En esta práctica, usted ejercita su conocimiento de los datos de pivote.
Si se encuentra con un problema de completar un ejercicio, puede instalar los proyectos terminados
Solución de la carpeta que se proporciona con el contenido complementario para este capítulo y
lección.

ejercicio 1 Datos de pivote mediante el uso de una expresión de tabla
En este ejercicio, pivota datos utilizando una expresión de tabla.
1. Abrir SSMS y conectarse a la base de datos ejemplo TSQL2012.
2. Escribir una consulta pivotar contra la mesa Sales.Orders que devuelve el envío máximo
fecha de cada año, el orden y la ID cargador. Regreso años de orden en las filas, ID de remitente (1, 2,
y 3) en columnas, y las fechas máximas de envío en la parte de datos.

168 Capítulo 5 Agrupación y de ventanas

Página 21
En primer lugar, intenta hacer frente a la tarea mediante la siguiente consulta.
AÑO SELECT (OrderDate) AS AñoPedido, [1], [2], [3]
DE Sales.Orders
Pivote (MAX (FechaEnvío) para IdDestinatario IN ([1], [2], [3])) AS P;
Que espera obtener tres filas en el resultado de los años 2006, 2007, y 2008, pero
su lugar se obtiene 830 filas en el resultado, al igual que el número de pedidos en la tabla.
3. Tratar de explicar por qué se ha obtenido el resultado deseado y encontrar una solución.
La razón por la que ha obtenido el resultado deseado es que se consulta la tabla Sales.Orders
di rectamente. La forma de SQL Server determina qué columnas para agrupar por es mediante el uso de
eliminación; las columnas de agrupación son todas las columnas que no se hayan indicado como spread­
ING (IdDestinatario, en este caso) y la agregación (FechaEnvío, en este caso). Todo lo que queda
columnas, incluyendo orderID se convirtieron implícitamente parte del grupo de la lista. Por lo tanto,
tienes una fila por orden en vez de una fila por año. Para solucionar el problema, se define una tabla
de expresión que contiene sólo la agrupación, la difusión, y la agregación de columnas, y
proporcionar la expresión de tabla como entrada a la consulta de pivote. Su solución debe ser similar
el seguimiento.
CON TAL COMO PivotData
(
AÑO SELECT (OrderDate) AS AñoPedido, IdDestinatario, FechaEnvío
DE Sales.Orders
)
AñoPedido SELECT, [1], [2], [3]
DE PivotData
Pivote (MAX (FechaEnvío) para IdDestinatario IN ([1], [2], [3])) AS P;
Aquí está la salida con fechas formateadas por razones de brevedad.
AñoPedido 1 2 3
­­­­­­­­­­­ ­­­­­­­­­­­ ­­­­­­­­­­­ ­­­­­­­­­­­
2007 2008­01­30 2008­01­21 2008­01­09
2008 2008­05­04 2008­05­06 2008­05­01
2006 2007­01­03 2006­12­30 2007­01­16

el ejercicio 2 Recuentos de pivote de datos y calcular
En este ejercicio, se aplica el agregado COUNT al pivotar datos. Al igual que en el ejercicio 1, se
trabajar con la tabla Sales.Orders en la base de datos de muestra TSQL2012.
1. Escriba una consulta dinámica que devuelve una fila para cada ID de cliente distinto, una columna para
cada identificador de remitente distinta, y el recuento de las órdenes en las intersecciones cliente­cargador.
Preparar una expresión de tabla que devuelve sólo el custid y columnas de la IdDestinatario
Sales.Orders mesa, y proporcionar esta expresión de tabla como entrada para el operador PIVOT.

https://translate.googleusercontent.com/translate_f 14/28
19/4/2017 Agrupación y Ventanilla
Pivotante y Unpivoting datos: Lección 2 capítulo 5
169

Página 22
A medida que su primer intento, trate de usar la función de agregado COUNT (*), de la siguiente manera.
CON TAL COMO PivotData
(
SELECCIONAR
custid, ­ agrupar la columna
IdDestinatario ­ la difusión de la columna
DE Sales.Orders
)
custid SELECT, [1], [2], [3]
DE PivotData
Pivote (COUNT (*) Para IdDestinatario IN ([1], [2], [3])) AS P;
Debido a que el operador PIVOT no admite el COUNT (*) función de agregado, se
el siguiente error.
Msg 102, nivel 15, estado 1, línea 10
Sintaxis incorrecta cerca '*'.
2. Trate de pensar en una solución para este problema.
Para resolver el problema, es necesario utilizar el COUNT (< col_name >) fun­ conjunto general
ción, pero recuerda que la entrada a la función de agregado no puede ser el resultado de
una expresión; en cambio, debe ser un nombre de columna que existe en la tabla consultada. Asi que
una opción que tienes es utilizar la columna de difusión como la columna de agregación, como se
en COUNT (IdDestinatario). La otra opción es crear una columna ficticia de una constante
expresión en la expresión de tabla, y luego usar esa columna como entrada para el COUNT
función, como sigue.
CON TAL COMO PivotData
(
SELECCIONAR
custid, ­ agrupar la columna
IdDestinatario, ­ la difusión de la columna
1 AS aggcol ­ columna agregación
DE Sales.Orders
)
custid SELECT, [1], [2], [3]
DE PivotData
Pivote (COUNT (aggcol) para IdDestinatario IN ([1], [2], [3])) AS P;
Esta consulta genera el resultado deseado.
custid 1 2 3
­­­­­­­ ­­­ ­­­ ­­­
1 4 1 1
2 1 0 3
3 2 3 2
4 1 8 4
5 5 9 4
6 1 3 3
7 5 3 3
8 1 2 0
9 6 7 4
10 3 3 8
...

170 Capítulo 5 Agrupación y de ventanas

Página 23
Resumen de la Lección

S Pivotante es una forma especial de la agrupación y agregación de datos en el que giran los datos
de un estado de filas a un estado de columnas.
S Cuando pivota datos, es necesario identificar tres cosas: el elemento de agrupación, spread­
elemento, y el elemento de agregación ing.
S T­SQL soporta un operador de mesa nativa llamada dinámica que se puede utilizar para hacer pivotar los datos
de la mesa de entrada.
S Unpivoting gira datos de un estado de columnas a un estado de filas.
S Para UNPIVOT datos, es necesario identificar tres cosas: las columnas de origen que usted necesita
a UNPIVOT, la columna de nombres de destino, y la columna de valores objetivo.
S T­SQL es compatible con un operador nativa llamada UNPIVOT que se puede utilizar para los datos UNPIVOT
de la mesa de entrada.

Repaso de la lección
Responder a las siguientes preguntas para poner a prueba su conocimiento de la información en esta lección. Tú
puede encontrar las respuestas a estas preguntas y explicaciones de por qué cada opción de respuesta es correcta
o incorrecta en la sección “Respuestas” al final de este capítulo.

https://translate.googleusercontent.com/translate_f 15/28
19/4/2017 Agrupación y Ventanilla
1. ¿Cómo determina el operador PIVOT lo que el elemento de agrupación es?
a. Es el elemento especificado como entrada a la función de agrupación.
B. Se determina por eliminación­el elemento (s) de la tabla consultada que eran
no especificado como los elementos de expansión o de agregación.
do. Es el elemento especificado en la cláusula GROUP BY.
D. Es la clave principal.
2. ¿Cuál de los siguientes no están permitidos en la especificación del operador PIVOT? (Escoger
todas las que correspondan.)
a. Especificación de un cálculo como entrada a la función de agregado
B. Especificación de un cálculo como el elemento de expansión
do. Especificación de una subconsulta en la cláusula IN
D. funciones múltiples agregados Especificación
3. ¿Cuál es el tipo de datos del objetivo valores de columna en el resultado de una UNPIVOT
¿operador?
a. INT
B. NVARCHAR (128)
do. SQL_VARIANT
D. El tipo de datos de las columnas de origen que UNPIVOT

Pivotante y Unpivoting datos: Lección 2 capítulo 5
171

Página 24
Lección 3: usando funciones de ventana

Al igual que las funciones de grupo, las funciones de ventana también le permiten realizar análisis de datos computacional
Ciones. La diferencia entre los dos está en cómo se define el conjunto de filas para la función
trabajar con. Con funciones de grupo, utiliza consultas agrupadas para organizar las filas consultados
en grupos, y entonces las funciones de grupo se aplican a cada grupo. Se obtiene una fila de resultados
por grupo, no por fila subyacente. Con funciones de la ventana, se define el conjunto de filas por
función y luego regresar un valor de resultado por cada fila y la función subyacente. usted dE­
una multa al conjunto de filas para la función de trabajar con el uso de una cláusula llamó.
Esta lección cubre tres tipos de funciones de la ventana: agregada, ranking, y offset.

Después de esta lección, usted será capaz de:
S Utilizar las funciones de ventana de agregados, las funciones de clasificación, y la ventana
compensado funciones.
S Definir partición ventana, pedidos, y el encuadre en sus funciones de la ventana.
Tiempo estimado de la lección: 60 minutos

Las funciones de agregación ventana
funciones de agregado ventana son los mismos que las funciones de agregación de un grupo (por ejemplo,
SUM, COUNT, AVG, MIN y MAX), excepto las funciones de ventana de agregados se aplican a un
ventana de filas definidas por la cláusula OVER.
Una de las ventajas de utilizar las funciones de ventana es que a diferencia de las consultas agrupadas, en ventanas
consultas no ocultan el detalle­regresan una fila para la fila de cada consulta subyacente. Esta
significa que se pueden mezclar los detalles y elementos agregados en la misma consulta, e incluso en el
misma expresión. El uso de la cláusula OVER, se define un conjunto de filas para la función de trabajar
con por cada fila subyacente. En otras palabras, una consulta de ventana define una ventana de filas
por cada función y fila de la consulta subyacente.
Como se ha mencionado, se utiliza una cláusula OVER para definir una ventana de filas para la función. los
ventana se define con respecto a la fila actual. Al utilizar paréntesis vacíos, OVER
cláusula representa conjunto de resultados de toda la consulta subyacente. Por ejemplo, la expresión
SUM (val) OVER () representa el total de todas las filas de la consulta subyacente. Puedes usar
una cláusula de partición ventana para restringir la ventana. Por ejemplo, el SUM expresión (val)
OVER (POR PARTICIÓN custid) representa el total del cliente actual. Como un ejemplo, si el
fila actual tiene ID de cliente 1, la cláusula sobre filtros de sólo aquellas filas de la subyacente
El resultado de consulta establecido en el ID de cliente es 1; Por lo tanto, la expresión devuelve el total para
cliente 1.

172 Capítulo 5 Agrupación y de ventanas

https://translate.googleusercontent.com/translate_f 16/28
19/4/2017 Agrupación y Ventanilla

Página 25
Aquí está un ejemplo de una consulta en la vista Sales.OrderValues   regresar para cada pedido
el ID de cliente, identificación de la orden, y el valor de orden; usando funciones de ventana, la consulta también devuelve el
total de todos los valores y el total del cliente.
custid SELECT, idpedido,
Val
SUM (val) OVER (PARTITION BY custid) AS TotalCli,
SUM (val) OVER () AS grandtotal
DE Sales.OrderValues;
Esta consulta genera la siguiente salida (que se muestra aquí en forma abreviada).
custid idpedido val TotalCli grandtotal
­­­­­­­ ­­­­­­­­ ­­­­­­­ ­­­­­­­­­­ ­­­­­­­­­­­
1 10643 814,50 4.273,00 1.265.793,22
1 10692 878,00 4.273,00 1.265.793,22
1 10702 330,00 4.273,00 1.265.793,22
1 10835 845,80 4.273,00 1.265.793,22
1 10952 471,20 4.273,00 1.265.793,22
1 11011 933,50 4.273,00 1.265.793,22
2 10926 514,40 1.402,95 1.265.793,22
2 10759 320,00 1.402,95 1.265.793,22
2 10625 479,75 1.402,95 1.265.793,22
2 10308 88,80 1.402,95 1.265.793,22
...
El total es, por supuesto, la misma para todas las filas. El total de los clientes es el mismo para todos
filas con el mismo ID de cliente.
Se pueden mezclar elementos de detalle y agregados con ventanas en la misma expresión. Por ejemplo,
amplia, la siguiente consulta calcula para cada pedido el porcentaje del valor del pedido actual
del total de los clientes, y también el porcentaje del total general.
custid SELECT, idpedido,
Val
CAST (100,0 * val / SUM (val) OVER (PARTITION BY custid) como numérico (5, 2)) AS pctcust,
CAST (100,0 * val / SUMA (val) OVER () Como numérico (5, 2)) AS pcttotal
DE Sales.OrderValues;
Esta consulta genera la siguiente salida (que se muestra aquí en forma abreviada).
custid idpedido val pctcust pcttotal
­­­­­­­ ­­­­­­­­ ­­­­­­­ ­­­­­­­­ ­­­­­­­­­
1 10643 814,50 19,06 0,06
1 10692 878,00 20,55 0,07
1 10 702 330,00 7,72 0,03
1 10835 845,80 19,79 0,07
1 10952 471,20 11,03 0,04
1 11011 933,50 21,85 0,07
2 10926 514,40 36,67 0,04
2 10759 320,00 22,81 0,03
2 10625 479,75 34,20 0,04
2 10308 88,80 6,33 0,01
...

Lección 3: Uso de funciones de la ventana capítulo 5
173

Página 26
La suma de todos los porcentajes de la suma total es de 100. La suma de todos los porcentajes de
el total del cliente es 100 para cada partición de filas con el mismo cliente.
funciones de agregado ventana apoyan otra opción de filtrado llamada enmarcar. La idea
es que se define ordenación dentro de la partición utilizando una cláusula para ventana, y luego
basado en ese orden, se puede confinar a un marco de filas entre dos delimitadores. Se define el
delimitadores mediante el uso de una cláusula de marco de ventana. La cláusula marco de la ventana requiere una orden ventana
cláusula estar presente porque un conjunto no tiene un orden, y sin orden, limitando filas entre
dos delimitadores no tendrían sentido.
En la cláusula marco de la ventana, usted indica las unidades de marco de ventana (filas o rango) y
la medida en marco de la ventana (los delimitadores). Con la unidad marco de la ventana filas, puede indi­
Cate los delimitadores como una de tres opciones:
S Sin límites anteriores o posteriores, es decir, el principio o el final de la parti­
ción, respectivamente
S CURRENT ROW, obviamente, que representa la fila actual
S < N > FILAS precedente o siguiente, significando n filas antes o después de la corriente,
respectivamente
A modo de ejemplo, supongamos que usted quiere consultar la vista Sales.OrderValues   y com­
PUTE los valores totales que van desde el inicio de la actividad del cliente actual hasta que el
Orden actual. Es necesario utilizar el agregado SUM. Particionar la ventana por custid. Tú

https://translate.googleusercontent.com/translate_f 17/28
19/4/2017 Agrupación y Ventanilla
ordenar la ventana por OrderDate, idpedido. A continuación, encuadrar las filas desde el principio de la
partición (sin límites anteriores) hasta que la fila actual. Su consulta debe parecerse a la
siguiendo.
custid SELECT, idpedido, OrderDate, val,
SUM (val) OVER (POR PARTICIÓN custid
ORDER BY OrderDate, idpedido
Filas entre ANTERIOR sin límites
Y CURRENT ROW) AS RunningTotal
DE Sales.OrderValues;
Esta consulta genera la siguiente salida (que se muestra aquí en forma abreviada).
custid idpedido OrderDate val RunningTotal
­­­­­­­ ­­­­­­­­ ­­­­­­­­­­­ ­­­­­­­ ­­­­­­­­­­­­­
1 10643 2007­08­25 814,50 814,50
1 10692 2007­10­03 878.00 1692.50
1 10702 2007­10­13 330.00 2022.50
1 10835 2008­01­15 845.80 2868.30
1 10952 2008­03­16 471.20 3339.50
1 11011 2008­04­09 933.50 4273.00
2 10308 2006­09­18 88.80 88.80
2 10625 2007­08­08 479,75 568,55
2 10759 2007­11­28 320.00 888.55
2 10926 2008­03­04 514.40 1402.95
...

174 Capítulo 5 Agrupación y de ventanas

Página 27
Observar cómo los valores se van acumulando desde el principio de la partición del cliente
hasta que la fila actual. Por cierto, en lugar de la forma detallada de las filas de extensión del marco
ENTRE ANTERIOR sin límites y la fila actual, se puede utilizar la forma más corta
FILAS sin límites anteriores, y conservan el mismo significado.
Usando las funciones de agregado de ventana para realizar cálculos como los totales acumulados, se
suelen tener un rendimiento mucho mejor en comparación con el uso de subconsultas y se une o grupo ag­
gregate funciones. funciones de la ventana se prestan a una buena optimización, especialmente cuando
usando sin límites anteriores como el primer delimitador.
En términos de procesamiento de consultas lógica, el resultado de una consulta se logra cuando se llega a la SE­
fase­después LECT el FROM, WHERE, GROUP BY, y las fases QUE TIENEN se han procesado.
Debido a que las funciones de ventana se supone que deben funcionar en conjunto de resultados de la consulta subyacente,
sólo se permiten en el SELECT y cláusulas ORDER BY. Si necesita hacer referencia al resultado de una
función de ventana en cualquier cláusula que se evalúa antes de la cláusula SELECT, es necesario utilizar
una expresión de tabla. Se invoca la función de ventana en la cláusula SELECT de la consulta interna,
la asignación de la expresión con un alias de columna. A continuación, se puede hacer referencia a ese alias de columna en el
consulta externa en todas las cláusulas.
Por ejemplo, supongamos que necesita para filtrar el resultado de la última consulta, devolviendo sólo
aquellas filas donde el total acumulado es inferior a 1.000,00. El código siguiente logra esto
la definición de una expresión de tabla común (CTE) en base a la consulta anterior y luego hacer la
el filtrado en la consulta externa.
CON RunningTotals AS
(
custid SELECT, idpedido, OrderDate, val,
SUM (val) OVER (POR PARTICIÓN custid
ORDER BY OrderDate, idpedido
Filas entre ANTERIOR sin límites
Y CURRENT ROW) AS RunningTotal
DE Sales.OrderValues
)
SELECCIONAR *
DE RunningTotals
DONDE RunningTotal <1000,00;
Esta consulta genera la siguiente salida (que se muestra aquí en forma abreviada).
custid idpedido OrderDate val RunningTotal
­­­­­­­ ­­­­­­­­ ­­­­­­­­­­­ ­­­­­­­ ­­­­­­­­­­­­­
1 10643 2007­08­25 814,50 814,50
2 10308 2006­09­18 88.80 88.80
2 10625 2007­08­08 479,75 568,55
2 10759 2007­11­28 320.00 888.55
3 10365 2006­11­27 403,20 403,20
...
Como otro ejemplo, para una medida marco de la ventana, si quería el marco para incluir sólo
las tres últimas filas, se utilizarían las FILAS forman entre 2 anterior y corriente
FILA.

Lección 3: Uso de funciones de la ventana capítulo 5
175

https://translate.googleusercontent.com/translate_f 18/28
19/4/2017 Agrupación y Ventanilla

Página 28
En cuanto a la medida en marco de la ventana GAMA, de acuerdo con el estándar SQL, que permite definir
delimitadores basados   en desplazamientos lógicos de clave de ordenación de la fila actual. Recuerde que las filas
define los delimitadores basados   en desplazamientos físicos en términos de número de filas de la Cur­
alquilar fila. Sin embargo, SQL Server 2012 tiene una aplicación muy limitada de la opción RANGE,
que soporta solamente ilimitada anterior o siguiente y CURRENT ROW como delimitadores.
Una diferencia sutil entre filas y GAMA cuando se utilizan los mismos delimitadores es que el
primero no incluye pares (filas atados en términos de la clave de ordenación) y el segundo lo hace.

IMPORTANTE FILAS VS. DISTANCIA
En SQL Server 2012, la opción FILAS por lo general se ha optimizado mucho mejor que RANGO
cuando se utilizan las mismas delimitadores. Si se define una ventana con una cláusula para ventana, pero
sin una cláusula marco de la ventana, el valor predeterminado es rango entre ANTERIOR sin límites
Y fila actual. Por lo tanto, a menos que después de que el comportamiento especial que se obtiene de
Rango que incluye pares, asegúrese de que utilice explícitamente la opción de filas.

Funciones de la ventana de Ranking
Con la clasificación ventana de funciones, puede clasificar filas dentro de una partición basado en especificada
Ordenando Al igual que con las otras funciones de la ventana, si no indican una cláusula de partición de ventana,
todo el resultado de la consulta subyacente se considera una partición. La cláusula de orden de la ventana es
obligatorio. funciones de clasificación de las ventanas no son compatibles con una cláusula marco de la ventana. soportes de T­SQL
cuatro funciones: la clasificación de las ventanas ROW_NUMBER, RANK, DENSE_RANK y NTILE.
La consulta siguiente muestra el uso de estas funciones.
custid SELECT, idpedido, val,
ROW_NUMBER () OVER (ORDER BY val) AS rownum,
RANGO() OVER (ORDER BY val) AS RNK,
DENSE_RANK () OVER (ORDER BY val) AS densernk,
NTILE (100) OVER (ORDER BY val) AS ntile100
DE Sales.OrderValues;
Esta consulta genera la siguiente salida (que se muestra aquí en forma abreviada).
custid idpedido val rownum RNK densernk ntile100
­­­­­­­ ­­­­­­­­ ­­­­­­ ­­­­­­­ ­­­­ ­­­­­­­­­ ­­­­­­­­­
12 10782 12.50 1 1 1 1
27 10807 18,40 2 2 2 1
66 10586 23,80 3 3 3 1
76 10767 28,00 4 4 4 1
54 10898 30,00 5 5 5 1
88 10900 33,75 6 6 6 1
48 10883 36,00 7 7 7 1
41 11051 36,00 8 7 7 1
71 10815 40,00 9 9 8 1
38 10674 45.00 10 10 9 2
53 11057 45.00 11 10 9 2
75 10271 48,00 12 12 10 2
...

176 Capítulo 5 Agrupación y de ventanas

Página 29

IMPORTANTE Presentación pedido vs. ordenación de ventana
La consulta de ejemplo no tiene una orden de presentación por parte de la cláusula, y por lo tanto, no hay
la garantía de que las filas serán presentados en un orden particular. La cláusula de orden ventana
sólo determina el pedido para el cálculo de la función de ventana. Si se invoca una ventana
la función de la consulta pero no especifica un orden de presentación BY, no hay ga­
tizar que las filas se presentan en el mismo orden que el pedido de la función de ventana.
Si necesita una garantía de este tipo, es necesario agregar un orden de presentación BY.

La función ROW_NUMBER calcula un número entero secuencial único a partir de 1 dentro de
la partición de ventanas basado en la ordenación de la ventana. Debido a que la consulta de ejemplo no lo hace
tener una cláusula de partición ventana, la función considera el resultado de toda la consulta establecido como uno
dividir; por lo tanto, la función asigna números de fila únicos a través de conjunto de resultados de toda la consulta.
Tenga en cuenta que si el pedido no es única, la función ROW_NUMBER no es determinista.
Por ejemplo, notar en el resultado de que dos filas tienen el mismo valor de pedido de 36,00, pero
las dos filas consiguieron diferentes números de fila. Esto se debe a la función debe generar único
números enteros en la partición. Actualmente, no hay desempate explícita, y por lo tanto la elección de
qué fila obtiene el número de la fila superior es arbitraria (optimización dependiente). Si necesita una
cálculo determinista (resultados repetibles garantizados), es necesario agregar un desempate. por
ejemplo, se podría añadir la clave principal para hacer el pedido único, como en ORDER BY val,
Solicitar ID.

https://translate.googleusercontent.com/translate_f 19/28
19/4/2017 Agrupación y Ventanilla
RANK y DENSE_RANK difieren de ROW_NUMBER en el sentido de que asignan la misma
clasificación de valor a todas las filas que comparten el mismo valor de pedido. La función devuelve el RANK
número de filas en la partición que tiene un valor de pedido inferior a la corriente, más 1. Por
ejemplo, considere las filas de un resultado de la consulta de ejemplo que tienen un valor de pedido de 45,00.
Nueve filas tienen valores de pedido que son inferiores a 45.00; Por lo tanto, estas filas consiguieron el rango 10
(9 + 1).
La función DENSE_RANK devuelve el número de valores de pedido distintas que son más bajos
que el actual, más 1. Por ejemplo, las mismas filas que obtuvieron el rango 10 consiguieron la densa
9. rango Eso es porque estas filas tienen un valor de pedido 45.00, y hay ocho distinta
ordenar los valores que son inferiores a 45.00. Debido a RANK considera filas y DENSE_RANK
considera valores distintos, el primero puede tener huecos entre resultado valores de clasificación, y el
este último no puede tener lagunas. Debido a que las funciones RANK y DENSE_RANK calculan la misma
valor de clasificación de filas con el mismo valor de ordenación, ambas funciones son deterministas, incluso
cuando el pedido no es única. De hecho, si se utiliza pedido único, ambas funciones devuelven el
mismo resultado que la función ROW_NUMBER. Así que por lo general estas funciones son interesantes para utilizar
cuando el pedido no es única.
Con la función NTILE, puede organizar las filas dentro de la partición en un solicitado
número de fichas de igual tamaño, con base en el orden especificado. Se especifica el nú­ deseada
BER de azulejos como entrada a la función. En la consulta de ejemplo, que solicitó 100 azulejos. Existen
830 filas en el conjunto de resultados, y por lo tanto el tamaño de la baldosa base es 830/100 = 8 con un resto de
30. Debido a que existe un resto de 30, los primeros 30 baldosas se asignan con una fila adicional.

Lección 3: Uso de funciones de la ventana capítulo 5
177

Página 30
A saber, los azulejos 1 a 30 tendrán nueve filas cada una, y todas las baldosas restantes (31 a 100)
tendrá ocho filas cada una. Observar en el resultado de esta consulta de ejemplo que los primeros nueve filas
(De acuerdo con val de pedido) se asignan con el número de baldosas 1, a continuación, los siguientes nueve filas son as­
firmado con el número de baldosas 2, y así sucesivamente. Al igual que ROW_NUMBER, la función NTILE no es determinista
tic cuando el pedido no es única. Si tiene que garantizar el determinismo, es necesario definir
ordenamiento único.

Sugerencia examen
como se explica en la discusión de las funciones de ventana de agregados, son funciones de la ventana al­
lowed sólo en el SELECT y cláusulas ORDER BY de la consulta. Si necesita hacer referencia a las
en otras cláusulas, por ejemplo, en la cláusula where­es necesario utilizar una expresión de tabla
tal como un CTE. Se invoca la función de ventana en la cláusula SELECT de la consulta interna, la asignación
la expresión con un alias de columna. A continuación, se hace referencia a que el alias de columna en la consulta externa de
Dónde cláusula. Usted tiene la oportunidad de practicar esta técnica en los ejercicios de esta lección.

Funciones de la ventana Offset
funciones de desplazamiento de ventana devuelven un elemento de una sola fila que está en un offset dado de la
fila actual en la partición de ventanas, o de la primera o la última fila en el marco de la ventana. T­SQL
soporta las siguientes funciones de desplazamiento de la ventana: GAL, LEAD, FIRST_VALUE y LAST_VALUE.
Las funciones de los GAL y el plomo se basan en un desplazamiento con respecto a la fila actual, y el FIRST_
funciones de valor y LAST_VALUE operan en la primera o la última fila en el marco, respectivamente.
Las funciones de los GAL y el plomo apoyan cláusulas de partición ventana y pedidos. Ellos no lo hacen
apoyar una cláusula marco de la ventana. La función LAG devuelve un elemento de la fila de la
partición actual que es un número solicitado de filas antes de la fila actual (basado en el
ordenación de la ventana), con 1 asume como el desplazamiento predeterminado. La función devuelve un ele­ LEAD
ment de la fila que se encuentra en la solicitaron el desplazamiento después de la fila actual.
Como ejemplo, la siguiente consulta utiliza las funciones de LAG y conducir a volver junto con
cada pedido el valor de la orden del cliente anterior, además del valor a partir de la siguiente
pedido del cliente.
custid SELECT, idpedido, OrderDate, val,
GAL (val) OVER (POR PARTICIÓN custid
ORDER BY OrderDate, idpedido) AS prev_val,
LEAD (val) OVER (POR PARTICIÓN custid
ORDER BY OrderDate, idpedido) AS next_val
DE Sales.OrderValues;

178 Capítulo 5 Agrupación y de ventanas

https://translate.googleusercontent.com/translate_f 20/28
19/4/2017 Agrupación y Ventanilla

Página 31
Esta consulta genera la siguiente salida (que se muestra aquí en forma abreviada).
custid idpedido OrderDate val prev_val next_val
­­­­­­­ ­­­­­­­­ ­­­­­­­­­­­ ­­­­­­­ ­­­­­­­­­ ­­­­­­­­ ­
1 10643 2007­08­25 814.50 878.00 NULL
1 10692 2007­10­03 878.00 814.50 330.00
1 10702 2007­10­13 330.00 878.00 845.80
1 10835 2008­01­15 845,80 330,00 471,20
1 10952 2008­03­16 471,20 845,80 933,50
1 11011 2008­04­09 933,50 471,20 NULL
2 10308 2006­09­18 88.80 479.75 NULL
2 10625 2007­08­08 479.75 88.80 320.00
2 10759 2007­11­28 320,00 479,75 514,40
2 10926 2008­03­04 514.40 320.00 NULL
...
Debido a que un \ explícita no se ha especificado, ambas funciones se basó en el valor predeterminado de 1. Si compensados
desea un desplazamiento diferente de 1, se especifica como el segundo argumento, como en el GAL (val, 3).
Observe que si una fila no existe en lo solicitado desplazamiento, la función devuelve un NULL
defecto. Si desea devolver un valor diferente en tal caso, especifique como el tercer argumento,
como en LAG (val, 3, 0).
Las funciones de FIRST_VALUE y LAST_VALUE vuelven una expresión de valor de la primera o la última
filas en el marco de la ventana, respectivamente. Naturalmente, las funciones de apoyo partición ventana,
de la orden, y el marco cláusulas. Como ejemplo, la siguiente consulta devuelve junto con cada pedido
los valores de la primera y la última pedidos del cliente.
custid SELECT, idpedido, OrderDate, val,
FIRST_VALUE (val) OVER (POR PARTICIÓN custid
ORDER BY OrderDate, idpedido
Filas entre ANTERIOR sin límites
Y CURRENT ROW) AS first_val,
LAST_VALUE (val) OVER (POR PARTICIÓN custid
ORDER BY OrderDate, idpedido
Filas entre CURRENT ROW
Y siguiendo sin límites) AS last_val
DE Sales.OrderValues;
Esta consulta genera la siguiente salida (que se muestra aquí en forma abreviada).
custid idpedido OrderDate val first_val last_val
­­­­­­­ ­­­­­­­­ ­­­­­­­­­­­ ­­­­­­­ ­­­­­­­­­­ ­­­­­­­ ­­­
1 11011 2008­04­09 933,50 814,50 933,50
1 10952 2008­03­16 471,20 814,50 933,50
1 10835 2008­01­15 845,80 814,50 933,50
1 10702 2007­10­13 330,00 814,50 933,50
1 10692 2007­10­03 878,00 814,50 933,50
1 10643 2007­08­25 814,50 814,50 933,50
2 10926 2008­03­04 514,40 88,80 514,40
2 10759 2007­11­28 320.00 88.80 514.40
2 10625 2007­08­08 479,75 88,80 514,40
2 10308 2006­09­18 88.80 88.80 514.40
...

Lección 3: Uso de funciones de la ventana capítulo 5
179

Página 32

IMPORTANTE marco predeterminado y el rendimiento de la gama
A modo de recordatorio, cuando un marco de ventana es aplicable a una función, pero no se especifica una
cláusula explícita marco de la ventana, el valor predeterminado es sin límites oscilan entre ANTERIOR
Y fila actual. Por motivos de rendimiento, en general se recomienda evitar la
opción RANGE; para ello, tiene que ser explícito con la cláusula filas. También, si lo que busca
la primera fila de la partición, utilizando la función de FIRST_ ALOR con el marco por defecto al menos
le da el resultado correcto. Sin embargo, si después de la última fila de la partición, utilizando
la función LAST_ ALOR con el marco por defecto no le dará lo que quiera, porque
la última fila de la trama predeterminado es la fila actual. Así, con la LAST_ ALOR, es necesario
ser explícito sobre el marco de la ventana con el fin de conseguir lo que está después. Y si es necesario
un elemento de la última fila de la partición, el segundo delimitador en el marco debe ser
Followin sin límites.

Comprobación rápida
1. ¿Cuáles son las cláusulas que los diferentes tipos de apoyo funciones de la ventana?
2. ¿Qué hacen los delimitadores sin límites anterior y no acotadas EL SEGUIMIENTO
ING representar?
Comprobar respuesta rápida
1. cláusulas de particionamiento, el orden y enmarcar.
https://translate.googleusercontent.com/translate_f 21/28
19/4/2017 Agrupación y Ventanilla

2. El principio y el final de la partición, respectivamente.

Practique usando funciones de ventana

En esta práctica, usted ejercita su conocimiento de las funciones de la ventana.
Si se encuentra con un problema de completar un ejercicio, puede instalar los proyectos terminados
Solución de la carpeta que se proporciona con el contenido complementario para este capítulo y
lección.

ejercicio 1 Las funciones de agregación uso de ventanas
En este ejercicio, se le da una tarea que requiere que escribir consultas mediante el uso de la ventana ag­
gregate funciones. Tratar de llegar por primera vez con su propia solución antes de mirar la proporcionada
uno.
1. Abrir SSMS y conectarse a la base de datos ejemplo TSQL2012.
2. Escribir una consulta en la Sales.OrderValues ver que los retornos por cada cliente y
ordenar el valor promedio móvil de los últimos tres órdenes del cliente.

180 Capítulo 5 Agrupación y de ventanas

Página 33
Su consulta solución debe ser similar a la siguiente consulta.
custid SELECT, idpedido, OrderDate, val,
AVG (val) OVER (POR PARTICIÓN custid
ORDER BY OrderDate, idpedido
Filas entre 2 ANTERIOR
Y CURRENT ROW) AS movingavg
DE Sales.OrderValues;
Esta consulta genera el siguiente resultado, que se muestra aquí en forma abreviada.
custid idpedido OrderDate val movingavg
­­­­­­ ­­­­­­­­ ­­­­­­­­­­­ ­­­­­­­ ­­­­­­­­­­­
1 10643 2007­08­25 814,50 814,500000
1 10692 2007­10­03 878,00 846,250000
1 10702 2007­10­13 330,00 674,166666
1 10835 2008­01­15 845,80 684,600000
1 10952 2008­03­16 471,20 549,000000
1 11011 2008­04­09 933,50 750,166666
2 10308 2006­09­18 88,80 88,800000
2 10625 2007­08­08 479,75 284,275000
2 10759 2007­11­28 320,00 296,183333
2 10926 2008­03­04 514,40 438,050000
...

el ejercicio 2 Utilice Clasificación de ventanas y Offset Funciones
En este ejercicio, se le da tareas que requieren que escriba consultas mediante el uso de clasificación ventana
y compensar funciones. Se le pide a filtrar filas basándose en el resultado de una ventana de fun­
ción, y escribir expresiones que se mezclan elementos de detalle y funciones de la ventana.
1. A medida que la siguiente tarea, escribir una consulta en la tabla Sales.Orders y filtrar los tres or­
ders con los valores más altos de carga por cada transportista utilizando idpedido como el desempate.
Es necesario utilizar la función ROW_NUMBER para filtrar las filas deseadas. Pero recuerda
que no se le permite hacer referencia a las funciones de ventana directamente en la cláusula WHERE.
La solución consiste en definir una expresión de tabla basada en una consulta que invoca el
función ROW_NUMBER y asigna la expresión con un alias de columna. Entonces tú puedes
manejar el filtrado de la consulta externa utilizando ese alias de columna. Aquí está la completa
consulta solución.
CON C AS
(
IdDestinatario SELECT, idpedido, carga,
ROW_NUMBER () OVER (PARTITION BY IdDestinatario
ORDER BY DESC de carga, idpedido) AS rownum
DE Sales.Orders
)
IdDestinatario SELECT, idpedido, carga
DE C
DONDE rownum <= 3
ORDER BY IdDestinatario, rownum;

Lección 3: Uso de funciones de la ventana capítulo 5
181

https://translate.googleusercontent.com/translate_f 22/28
19/4/2017 Agrupación y Ventanilla
Página 34
Esta consulta genera el siguiente resultado.
flete idpedido IdDestinatario
­­­­­­­­­­ ­­­­­­­­ ­­­­­­­­­
1 10430 458,78
1 10836 411,88
1 10658 364,15
2 10372 890,78
2 11030 830,75
2 10691 810,05
3 10540 1007.64
3 10479 708,95
3 11032 606,19
2. A medida que su última tarea, consulte la vista Sales.OrderValues. Es necesario para calcular la diferen­
rencia entre el valor del pedido actual y el valor de la orden anterior del cliente,
Además de la diferencia entre el valor de la orden actual y el valor de la
próximo pedido del cliente.
Para obtener los valores de las órdenes anteriores y siguientes del cliente, puede utilizar el GAL y
funciones de plomo, respectivamente. A continuación, puede restar los resultados de dichas funciones desde
la columna de la val para obtener las diferencias deseadas. Aquí está la solución completa consulta.
custid SELECT, idpedido, OrderDate, val,
val ­ GAL (val) OVER (POR PARTICIÓN custid
ORDER BY OrderDate, idpedido) AS diffprev,
val ­ LEAD (val) OVER (POR PARTICIÓN custid
ORDER BY OrderDate, idpedido) AS diffnext
DE Sales.OrderValues;
Esta consulta genera el siguiente resultado, que se muestra aquí en forma abreviada.
custid idpedido OrderDate val diffprev diffnext
­­­­­­­ ­­­­­­­­ ­­­­­­­­­­­ ­­­­­­­ ­­­­­­­­­ ­­­­­­­­ ­
1 10643 2007­08­25 814,50 ­63,50 NULL
1 10692 2007­10­03 878.00 63.50 548.00
1 10702 2007­10­13 330,00 ­548,00 ­515,80
1 10835 2008­01­15 845,80 515,80 374,60
1 10952 2008­03­16 471,20 ­374,60 ­462,30
1 11011 2008­04­09 933,50 462,30 NULL
2 10308 2006­09­18 88.80 ­390.95 NULL
2 10625 2007­08­08 479,75 390,95 159,75
2 10759 2007­11­28 320,00 ­159,75 ­194,40
2 10926 2008­03­04 514.40 194.40 NULL
...

182 Capítulo 5 Agrupación y de ventanas

Página 35
Resumen de la Lección

S Funciones de ventana realizan cálculos de análisis de datos. Operan en un conjunto de filas
se define para cada fila subyacente mediante el uso de una cláusula llamó.
S A diferencia de las consultas agrupadas, que ocultan las filas de detalles y regresar sólo una fila por cada
consultas de grupo, con ventanas no ocultan el detalle. Vuelven una fila por cada fila de la
subyacente a consulta, y permitir que la mezcla de elementos de detalle y funciones de la ventana de la misma
expresiones.
S T­SQL admite agregada ventana, ranking, y compensar funciones. Todas las funciones de la ventana
apoyar partición ventana y cláusulas de orden ventana. funciones de la ventana de agregados, en
Además de FIRST_VALUE y LAST_VALUE, también el apoyo de una cláusula de marco de ventana.

más info funciones de la ventana
Para obtener información más detallada acerca de las funciones de ventana, su optimización, y práctico
usos, vea el libro de Microsoft SQL Server 2012 de alto rendimiento de T­SQL mediante la ventana
Funciones , por Itzik Ben­Gan (Microsoft Press, 2012).

Repaso de la lección
Responder a las siguientes preguntas para poner a prueba su conocimiento de la información en esta lección. Tú
puede encontrar las respuestas a estas preguntas y explicaciones de por qué cada opción de respuesta es correcta
o incorrecta en la sección “Respuestas” al final de este capítulo.

https://translate.googleusercontent.com/translate_f 23/28
19/4/2017 Agrupación y Ventanilla
1. ¿Cuál es la función de ventana de marco por defecto cuando se utiliza una cláusula para ventana es speci­
ficado, pero una cláusula explícita marco de la ventana no es? (Elija todas las que apliquen.)
a. FILAS entre la fila anterior y corriente sin límites
B. FILAS sin límites ANTERIOR
do. GAMA entre la fila anterior y corriente sin límites
D. GAMA sin límites ANTERIOR
2. ¿Qué funciones del DENSE_RANK RANK y calculan?
a. La función RANK devuelve el número de filas que tienen un valor menor de pedidos
(Suponiendo ordenación ascendente) de la corriente; los retornos de función DENSE_RANK
el número de valores de pedido distintas que son más bajos que los actuales.
B. La función RANK devuelve uno más que el número de filas que tienen una menor
ordenando el valor de la corriente; la función devuelve uno DENSE_RANK más de
el número de valores de pedido distintas que son más bajos que los actuales.
do. La función RANK devuelve uno menos que el número de filas que tienen una menor
ordenando el valor de la corriente; la función DENSE_RANK devuelve uno menos de
el número de valores de pedido distintas que son más bajos que los actuales.
D. Las dos funciones devuelven el mismo resultado a menos que el pedido es único.

Lección 3: Uso de funciones de la ventana capítulo 5
183

Página 36
3. ¿Por qué las funciones de la ventana se permiten sólo en el SELECT y ORDER BY cláusulas de una
¿consulta?
a. Debido a que se supone que deben operar en el resultado de la consulta subyacente, que es
alcanzado cuando el procesamiento de consultas lógica llega a la fase SELECT.
B. Debido a que Microsoft no tenía tiempo para ponerlas en práctica en otras cláusulas.
do. Debido a que no será necesario filtrar o agrupar datos en base al resultado de la ventana
Funciones.
D. Debido a que en las otras cláusulas, las funciones se consideran funciones de la puerta (también
conocido como funciones de puerta trasera).

escenarios

En los siguientes escenarios de casos, se aplica lo que ha aprendido sobre la agrupación y la ventana­
En g. Puede encontrar las respuestas a estas preguntas en la sección “Respuestas” al final de este
capítulo.

Escenario Caso 1: mejora de las operaciones de análisis de datos
Que es un analista de datos en una empresa financiera que utiliza SQL Server 2012 para su base de datos. los
compañía ha actualizado recientemente el sistema de SQL Server 2000. A menudo se utiliza T­SQL
consultas en la base de datos de la empresa para analizar los datos. Hasta el momento, que se limitaron a código
que era compatible con SQL Server 2000, basándose principalmente en uniones, subconsultas, y agrupados
consultas. Sus consultas son a menudo complejos y lentos. Ahora está evaluando el uso de distintas prestaciones
turas disponibles en SQL Server 2012.
1. A menudo se necesita para calcular cosas como totales acumulados, cálculos del año hasta la fecha, y
las medias móviles. ¿Qué va a considerar ahora para manejar esos? ¿Cuáles son las cosas
usted debe mirar hacia fuera para el fin de obtener un buen rendimiento?
2. De vez en cuando, es necesario crear informes de referencias cruzadas en el que giran los datos de filas
a columnas o al revés. Hasta el momento, ha importado los datos a Microsoft Excel y
manejado este tipo de necesidades, pero prefiere hacerlo en T­SQL. ¿Qué va a considerar US­
ing para este fin? ¿Qué debe tener cuidado al usar las características que usted está
¿considerando?
3. En muchas de sus consultas, es necesario realizar cálculos, que lo reciente es decir, identificar
el tiempo transcurrido entre un evento anterior y el actual, o entre la corriente
evento y el siguiente. Hasta el momento, ha utilizado para este sub consultas. ¿Qué va a considerar ahora
¿en lugar?

184 Capítulo 5 Agrupación y de ventanas

Página 37
https://translate.googleusercontent.com/translate_f 24/28
19/4/2017 Agrupación y Ventanilla

Escenario Caso 2: La entrevista para un puesto de desarrollador
Son entrevistados para una posición como desarrollador de T­SQL. Responder a las siguientes preguntas
presentada a usted por su entrevistador.
1. Describir la diferencia entre ROW_NUMBER y rango.
2. Describir la diferencia entre las filas y las unidades de marco de ventana GAMA.
3. ¿Por qué puede no referirse a una función de ventana en la cláusula WHERE de una consulta y lo
es la solución para eso?

prácticas sugeridas

Para ayudarle a dominar con éxito los objetivos del examen se presentan en este capítulo, completar el
las siguientes tareas.

procesamiento de consultas Logical
Para practicar sus conocimientos de procesamiento de consultas lógica, identificar el orden en el que la variabilidad
Se evalúan cláusulas de consulta ous. También identificar las cláusulas en las que los cálculos aprendieron
en este capítulo están permitidos.
S Práctica 1 En este punto, en este kit de entrenamiento que debe estar familiarizado con todos los principales SE­
Lect cláusulas de consulta: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, TOP, y
OFFSET­FETCH. Identificar el orden en que se evalúan conceptualmente estas cláusulas
de acuerdo con el procesamiento de consultas lógico. Asimismo, identificar las cláusulas en las que el pivote y
operadores UNPIVOT operan. Por último, identificar las cláusulas en las que las funciones de grupo son
permitido y las cláusulas en la que se permiten las funciones de ventana.
S la práctica 2 Piense e identificar las ventajas lógicas que fun­ ventana de agregados
ciones tienen sobre los agregados agrupados y más agregados computado en subconsultas.

Prácticas sugerido el capítulo 5 185

Página 38
Respuestas

Esta sección contiene las respuestas a las preguntas de repaso de lecciones y soluciones para el caso
escenarios en este capítulo.

Lección 1

1. respuesta correcta: D
a. incorrectas: Se pueden ingresar las filas del grupo sin invocar una función de agregado.
B. incorrecto: Una consulta puede tener una función agregada sin una cláusula GROUP BY.
La agrupación está implícito­todas las filas hacen a un grupo.
do. incorrecta: No hay necesidad de elementos agrupados en aparecer en el SELECT
lista, aunque es común para devolver los elementos que agrupar.
D. corregir: Una consulta agrupados devuelve sólo una fila por cada grupo. Por esta razón, todos
expresiones que aparecen en las fases que se evalúan después de la cláusula GROUP BY
(Habiendo, SELECT y ORDER BY) debe garantizar devolver un solo valor por
grupo. Ahí es donde la restricción viene.
2. respuestas correctas: b, c, y D
a. incorrectas: Estas funciones no se pueden utilizar en la cláusula GROUP BY.
B. corregir: Cuando las funciones devuelven un 1 bit, un NULL es un marcador de posición; Cuando ellos
devolver un bit 0, NULL se origina en la tabla.
do. correcta: Cada conjunto de agrupación puede ser identificado con una combinación única de 1s y
https://translate.googleusercontent.com/translate_f 25/28
19/4/2017 Agrupación y Ventanilla
0s devueltos por estas funciones.
D. corregir: Estas funciones se pueden utilizar para la clasificación, ya que regresan un bit 0 para una
elemento de detalle y un bit 1 para un elemento agregado. Así que si desea ver los detalles
primero, ordenar por el resultado de la función en orden ascendente.
3. respuesta correcta: una
a. correcta: El (*) función COUNT si no funciona en una expresión de entrada; en lugar,
se cuenta el número de filas en el grupo. El (<COUNT expresión >) Función
opera en una expresión y hace caso omiso de valores nulos. Curiosamente, COUNT (< expresión >)
devuelve 0 cuando todas las entradas son valores nulos, mientras que otras funciones de conjunto general como MIN,
MAX, SUM, AVG y devuelven un valor NULL en un caso así.
B. incorrecto: COUNT (*) cuenta filas.
do. incorrecta: COUNT (*) devuelve un int.
D. incorrecta: Claramente, hay una diferencia entre las funciones en el tratamiento de la
Valores nulos.

186 Capítulo 5 Agrupación y de ventanas

Página 39
Lección 2

1. respuesta correcta: b
a. incorrecta: La función de agrupación se relaciona con la agrupación de conjuntos­no pivotante.
B. corregir: El operador PIVOT determina el elemento de agrupación por eliminación­
que es lo que queda, además de los elementos de expansión y de agregación.
do. incorrecta: Cuando se utiliza el operador de pivote, la agrupación para pivotar sucede como
parte del pivote del operador antes de la cláusula GROUP BY se evalúa.
D. incorrecta: El operador PIVOT no se fija en definiciones de restricciones para determinar
el elemento de agrupación.
2. respuestas correctas: a, b, c, y D
a. Correcto: No se puede especificar un cálculo como entrada a la función de agregado,
más bien sólo un nombre de una columna de la tabla de entrada.
B. corrige: No puede especificar un cálculo como el elemento de expansión, más bien sólo una
nombre de una columna de la tabla de entrada.
do. correcta: No se puede especificar una subconsulta en la cláusula IN, más bien sólo una lista estática.
D. corrige: No puede especificar múltiples funciones de agregado, en lugar sólo uno.
3. respuesta correcta: D
a. incorrecta: El tipo de la columna de valores no es necesariamente siempre una INT.
B. incorrecta: El tipo de la columna de valores no es necesariamente siempre una NVAR­
CHAR (128) ­que es el caso con la columna de nombres.
do. incorrecta: El tipo de la columna de valores no es SQL_VARIANT.
D. corregir: El tipo de la columna de valores es el mismo que el tipo de las columnas que
que UNPIVOT, y por lo tanto todos ellos deben tener un tipo común.

Lección 3

1. respuestas correctas: C y D
a. incorrecto: El marco predeterminado se basa en la unidad de GAMA.
B. incorrecto: El marco predeterminado se basa en la unidad de GAMA.
do. correcta: Esta es la trama predeterminado.
D. corregir: Esta es una forma abreviada de la trama predeterminada, que tiene el mismo significado.
2. respuesta correcta: b
a. incorrecta: Estas definiciones son uno menos que los correctos.
B. corregir: Estas son las definiciones correctas.
do. incorrecta: Estas definiciones son dos menos que los correctos.
D. incorrecta: Lo contrario es cierto, los dos funciones devuelven el mismo resultado cuando
el orden es único.

Respuestas capítulo 5 187

Página 40

https://translate.googleusercontent.com/translate_f 26/28
19/4/2017 Agrupación y Ventanilla
3. respuesta correcta: una
a. correcta: Funciones de ventana se supone que deben funcionar en re de la consulta subyacente
establece sultado. En términos de procesamiento de consultas lógico, este conjunto de resultados que se alcanza en el SELECT
fase.
B. incorrecto: estándar SQL define esta restricción, por lo que no tiene nada que ver con
las limitaciones de tiempo de Microsoft.
do. incorrecta: Hay razones prácticas que desea filtrar o agrupar datos en base a la
resultados de funciones de la ventana.
D. incorrecta: No hay ni funciones de la puerta ni las funciones de puerta trasera en SQL.

Escenario Caso 1

1. funciones de agregado de ventana son excelentes para este tipo de cálculos. En cuanto a las cosas a
tener en cuenta, con la implementación actual en SQL Server 2012, debe gene­
aliado tratar de evitar el uso de la unidad de marco de la ventana GAMA. Y recuerda que sin una
cláusula explícita marco de la ventana, se obtiene GAMA por defecto, por lo que desea ser explícitos y
utilizar la opción de filas.
2. Los operadores de pivote y UNPIVOT son útiles para consultas de referencias cruzadas. Una cosa a tener
cuidado con el uso de PIVOT cuando se relaciona con el hecho de que el elemento de agrupación es
determinado por la eliminación, lo que queda de la tabla de entrada que no fue especificado como
o bien la difusión o elementos de agregación. Por lo tanto, se recomienda siempre de­
multa una expresión de tabla de regresar la agrupación, la difusión, y los elementos de agregación,
y utilizar esa tabla como la entrada al operador PIVOT.
3. Las funciones de los GAL y el plomo son naturales para este propósito.

Escenario Caso 2

1. La función ROW_NUMBER no es sensible a los lazos en los valores de la ventana de pedidos. Ahí­
tanto, el cálculo es determinista sólo cuando la ordenación de ventana es única. Cuando
la ordenación de la ventana no es única, la función no es determinista. La función RANK
es sensible a los lazos y produce el mismo valor de rango a todas las filas con el mismo orden
valor. Por lo tanto, es determinista, incluso cuando la ordenación de la ventana no es única.
2. La diferencia entre las filas y el rango es en realidad similar a la diferencia entre
ROW_NUMBER y RANK, respectivamente. Cuando la ordenación de la ventana no es única, las filas
no incluye pares, y por lo tanto no es determinista, mientras gama incluye
compañeros, por lo que es determinista. Además, la opción FILAS se puede optimizar con una
eficiente en memoria carrete; GAMA se optimiza con un carrete en el disco y por lo tanto es
por lo general más lento.

188 Capítulo 5 Agrupación y de ventanas

Página 41
3. Funciones de ventana sólo se permiten en el SELECT y cláusulas ORDER BY porque el
ventana inicial que se supone que es trabajar con conjunto de resultados de la consulta subyacente. Si
necesita filtrar filas sobre la base de una función de ventana, es necesario utilizar una tabla de expre­
sión como un CTE o tabla derivada. Se especifica la función de ventana en la consulta interna de
SELECT cláusula y asignar la columna de destino un alias. A continuación, puede filtrar las filas de
refiriéndose a ese alias de columna en la consulta externa de la cláusula WHERE.

https://translate.googleusercontent.com/translate_f 27/28
19/4/2017 Agrupación y Ventanilla

Respuestas capítulo 5 189

https://translate.googleusercontent.com/translate_f 28/28

También podría gustarte