sql >> Base de Datos >  >> RDS >> Database

Comprender el operador de pivote en SQL

El operador de pivote en SQL Server convierte cada fila del conjunto de resultados agregado en columnas correspondientes en el conjunto de salida. El operador pivote es particularmente útil para escribir consultas de tabulación cruzada.

Echemos un vistazo a cómo funciona en la práctica.

Preparación de los datos

Primero, creemos algunos datos ficticios que luego podemos usar para implementar el operador pivote.

CREATE DATABASE schooldb
					
CREATE TABLE student
(
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender VARCHAR(50) NOT NULL,
    DOB datetime NOT NULL,
    total_score INT NOT NULL,
    city VARCHAR(50) NOT NULL
 )

INSERT INTO student

VALUES (1, 'Jolly', 'Female', '12-JUN-1989', 500, 'London'), 
(2, 'Jon', 'Male', '02-FEB-1974', 545, 'Manchester'), 
(3, 'Sara', 'Female', '07-MAR-1988', 600, 'Leeds'), 
(4, 'Laura', 'Female', '22-DEC-1981', 400, 'Liverpool'), 
(5, 'Alan', 'Male', '29-JUL-1993', 500, 'London'), 
(6, 'Kate', 'Female', '03-JAN-1985', 500, 'Liverpool'), 
(7, 'Joseph', 'Male', '09-APR-1982', 643, 'London'), 
(8, 'Mice', 'Male', '16-AUG-1974', 543, 'Liverpool'), 
(9, 'Wise', 'Male', '11-NOV-1987', 499, 'Manchester'), 
(10, 'Elis', 'Female', '28-OCT-1990', 400, 'Leeds');

¿Cómo funciona el operador pivote?

La forma estándar de agrupar datos SQL es mediante la cláusula Group By. Vamos a crear una consulta que calcule el promedio de los valores en la columna total_score de la tabla de estudiantes, agrupados por ciudad.

USE schooldb

SELECT 
	city,
	AVG(total_score) as Avg_Score
FROM 
	student
GROUP BY
	city

Esto da el siguiente resultado:

[identificación de la tabla=25 /]

¿Qué pasa si queremos un conjunto de resultados en el que los nombres de las ciudades se muestren en columnas donde cada columna contenga el valor promedio de la puntuación total de los estudiantes que pertenecen a esa ciudad? Algo como esto:

[identificación de la tabla=26 /]

Aquí es donde el operador pivote resulta útil.

Seleccionando los Datos Base

El primer paso al usar el operador pivote es seleccionar los datos base en los que se basará el operador pivote. Queremos agrupar nuestros datos por ciudad y encontrar el promedio de la puntuación total de los estudiantes que pertenecen a esa ciudad. Por lo tanto, necesitamos escribir una instrucción SELECT simple que seleccione la ciudad y la puntuación total.

SELECT 
	city,
	total_score
FROM 
	student

Crear un conjunto de datos temporal

Ahora, idealmente, podríamos aplicar directamente el operador de pivote en los datos base que creamos en la sección anterior, pero desafortunadamente no podemos. Para que el operador pivote funcione, debemos crear una expresión con valores de tabla a la que podamos aplicar el operador pivote. Tenemos una variedad de opciones aquí; podríamos usar tablas derivadas, expresiones de tablas comunes (CTE) o incluso podríamos crear tablas temporales.

Para este ejemplo, utilizaremos una tabla derivada rápida y sencilla. Para hacer eso con la declaración de selección básica que creamos en la última sección, la envolvemos en un conjunto de paréntesis y luego le aplicamos un alias. Finalmente, seleccionamos todo de esa tabla derivada.

SELECT * FROM

(SELECT 
	city,
	total_score
FROM 
	student
)
AS StudentTable

Aplicando el Operador de Pivote

Ahora que hemos preparado nuestros datos base y hemos creado una tabla derivada, le aplicaremos el operador pivote.

Para hacer esto, inserte "PIVOT" al final de la tabla derivada, seguido de un conjunto de paréntesis, y asigne un alias a esta tabla dinámica.

Dentro del paréntesis, tenemos que especificar alguna información importante.

  1. Necesitamos especificar el campo al que queremos aplicar una función agregada. En nuestro caso, queremos aplicar la función de agregado AVG en la columna "total_score".
  2. Luego, tenemos que decir en qué columnas de los datos base estamos girando nuestros datos. Lo hacemos escribiendo "PARA" seguido del nombre de la columna que es una ciudad en nuestro ejemplo.
  3. El paso final es un poco irritante. Tenemos que enumerar los valores de la columna de la ciudad que queremos que se conviertan en encabezados en nuestra tabla dinámica. Usamos el operador IN seguido de un conjunto de paréntesis. Dentro del paréntesis, usamos una lista separada por comas donde escribimos el nombre de cada columna dentro de un corchete. En nuestro ejemplo, queremos Londres, Leeds y Manchester como los nombres de encabezado de la tabla dinámica, por lo que los escribimos en este formato:([Londres], [Leeds], [Manchester]).
USE schooldb

SELECT * FROM

(SELECT 
	city,
	total_score
FROM 
	student
)
AS StudentTable
PIVOT(
	AVG(total_score)
	FOR city IN ([London],[Liverpool],[Leeds],[Manchester])
) AS StudentPivotTable

Si ejecuta la consulta anterior, los resultados se verán así:

[identificación de la tabla=27 /]

Agregar grupos de filas en la tabla dinámica

En las secciones anteriores, vimos cómo convertir grupos de filas en grupos de columnas usando el operador pivote. Sin embargo, también puede agregar grupos de filas junto con grupos de columnas en una tabla dinámica.

Por ejemplo, si desea encontrar el valor promedio de la columna total_score de todos los estudiantes agrupados por ciudad y por género, puede usar el grupo de columnas y el grupo de filas en conjunto dentro de una tabla dinámica. Aquí, cada columna representará el nombre de una ciudad y cada fila representará el género de un estudiante.

Afortunadamente, no tiene que escribir ningún script adicional para agregar grupos de filas a una tabla dinámica. Dentro del conjunto de datos base, simplemente agregue el nombre de la columna que desea agregar como un grupo de filas a la tabla dinámica.

USE schooldb

SELECT * FROM

(SELECT 
	city,
	gender,
	total_score
FROM 
	student
)
AS StudentTable
PIVOT(
	AVG(total_score)
	FOR city IN ([London],[Liverpool],[Leeds],[Manchester])
) AS StudentPivotTable

En el script anterior, simplemente agregamos la columna "género" en la instrucción SELECT base.

El resultado de la consulta anterior se ve así:

[identificación de la tabla=28 /]

Esto es tabulación cruzada. Por ejemplo, se puede ver a partir de los resultados que el puntaje total promedio de las estudiantes que viven en Londres es 500. De manera similar, el puntaje total promedio de los estudiantes varones que viven en Londres es 571.

Lea también:

Crear una tabla dinámica dinámica con la función QUOTENAME