MySQL Pivot: rotación de filas a columnas

Mysql Pivot Rotating Rows Columns



Una tabla de base de datos puede almacenar diferentes tipos de datos y, a veces, necesitamos transformar datos de nivel de fila en datos de nivel de columna. Este problema se puede resolver utilizando la función PIVOT (). Esta función se utiliza para rotar filas de una tabla en valores de columna. Pero esta función es compatible con muy pocos servidores de bases de datos, como Oracle o SQL Server. Si desea hacer la misma tarea en la tabla de la base de datos MySQL, entonces debe escribir la consulta SELECT usando la instrucción CASE para rotar las filas en columnas. El artículo muestra la forma de realizar la tarea de la función PIVOT () dentro de las tablas de bases de datos MySQL relacionadas.

Requisito previo:

Debe crear una base de datos y algunas tablas relacionadas donde las filas de una tabla se convertirán en columnas como la función PIVOT (). Ejecute las siguientes declaraciones SQL para crear una base de datos denominada ' unidb 'Y cree tres tablas llamadas' estudiantes ’, ‘ cursos ' y ' resultado ’. estudiantes y resultado Las tablas estarán relacionadas por una relación de uno a muchos y cursos y resultados Las tablas se relacionarán aquí mediante una relación de uno a varios. CREAR declaración de la resultado La tabla contiene dos restricciones de clave externa para los campos, std_id , y course_id .







CREAR BASE DE DATOS unidb;
USE unidb;

Estudiantes de CREATE TABLE(
identificaciónLLAVE PRIMARIA INT,
nombre varchar(50)NO NULO,
departamento VARCHAR(15)NO NULO);

Cursos de CREAR MESA(
course_id VARCHAR(20)CLAVE PRIMARIA,
nombre varchar(50)NO NULO,
crédito SMALLINT NOT NULL);

Resultado de CREAR TABLA(
std_id INT NO NULO,
course_id VARCHAR(20)NO NULO,
mark_type VARCHAR(20)NO NULO,
marca SMALLINT NOT NULL,
CLAVE EXTERNA(std_id)REFERENCIAS estudiantes(identificación),
CLAVE EXTERNA(course_id)Cursos de REFERENCIAS(course_id),
CLAVE PRIMARIA(std_id, course_id, mark_type));

Inserte algunos registros en estudiantes, cursos y resultado mesas. Los valores deben insertarse en las tablas según las restricciones establecidas en el momento de la creación de la tabla.



INSERTAR LOS VALORES DE LOS ESTUDIANTES
( '1937463','Harper Lee','CSE'),
( '1937464','Garcia Marquez','CSE'),
( '1937465','Forster, E.M.','CSE'),
( '1937466','Ralph Ellison','CSE');

INSERTAR EN LOS CURSOS VALORES
( 'CSE-401','Programación orientada a objetos',3),
( 'CSE-403','Estructura de datos',2),
( 'CSE-407','Programación Unix',2);

INSERTAR EN LOS VALORES DE RESULTADOS
( '1937463','CSE-401','Examen interno',15),
( '1937463','CSE-401','Examen de mitad de período',20),
( '1937463','CSE-401','Final Exam',35),
( '1937464','CSE-403','Examen interno',17),
( '1937464','CSE-403','Examen de mitad de período',15),
( '1937464','CSE-403','Final Exam',30),
( '1937465','CSE-401','Examen interno',18),
( '1937465','CSE-401','Examen de mitad de período',23),
( '1937465','CSE-401','Final Exam',38),
( '1937466','CSE-407','Examen interno',20),
( '1937466','CSE-407','Examen de mitad de período',22),
( '1937466','CSE-407','Final Exam',40);

Aquí, resultado La tabla contiene múltiples valores iguales para std_id , mark_type y course_id columnas en cada fila. En la siguiente parte de este tutorial se muestra cómo convertir estas filas en columnas de esta tabla para mostrar los datos en un formato más organizado.



Gire filas a columnas usando la instrucción CASE:

Ejecute la siguiente instrucción SELECT simple para mostrar todos los registros del resultado mesa.





SELECCIONE*DESDE resultado;

El resultado muestra las calificaciones de los cuatro estudiantes para tres tipos de exámenes de tres cursos. Entonces los valores de std_id , course_id y mark_type se repiten varias veces para los diferentes estudiantes, cursos y tipos de exámenes.



La salida será más legible si la consulta SELECT se puede escribir de manera más eficiente usando la instrucción CASE. El siguiente SELECT con la instrucción CASE transformará los valores repetidos de las filas en los nombres de las columnas y mostrará el contenido de las tablas en un formato más comprensible para el usuario.

SELECCIONE result.std_id, result.course_id,
MAX(CASE WHEN result.mark_type ='Examen interno'ENTONCES resultado.marcas FIN) 'Examen interno',
MAX(CASE WHEN result.mark_type ='Examen de mitad de período'ENTONCES resultado.marcas FIN) 'Examen de mitad de período',
MAX(CASE WHEN result.mark_type ='Final Exam'ENTONCES resultado.marcas FIN) 'Final Exam'
DESDE resultado
GROUP BY result.std_id, result.course_id
ORDER BY result.std_id, result.course_id ASC;

El siguiente resultado aparecerá después de ejecutar la declaración anterior, que es más legible que el resultado anterior.

Gire filas a columnas usando CASE y SUM ():

Si desea contar el número total de cada curso de cada estudiante de la tabla, debe usar la función agregada SUMA() agrupar por std_id y course_id con la sentencia CASE. La siguiente consulta se crea modificando la consulta anterior con la función SUM () y la cláusula GROUP BY.

SELECCIONE result.std_id, result.course_id,
MAX(CASE WHEN result.mark_type ='Examen interno'ENTONCES resultado.marcas FIN) 'Examen interno',
MAX(CASE WHEN result.mark_type ='Examen de mitad de período'ENTONCES resultado.marcas FIN) 'Examen de mitad de período',
MAX(CASE WHEN result.mark_type ='Final Exam'ENTONCES resultado.marcas FIN) 'Final Exam',
SUMA(resultado.marcas) comoTotal
DESDE resultado
GROUP BY result.std_id, result.course_id
ORDER BY result.std_id, result.course_id ASC;

La salida muestra una nueva columna llamada Total que muestra la suma de las calificaciones de todos los tipos de exámenes de cada curso obtenidos por cada estudiante en particular.

Rotar filas a columnas en varias tablas:

Las dos consultas anteriores se aplican al resultado mesa. Esta tabla está relacionada con las otras dos tablas. Estos son estudiantes y cursos . Si desea mostrar el nombre del estudiante en lugar de la identificación del estudiante y el nombre del curso en lugar de la identificación del curso, entonces debe escribir la consulta SELECT usando tres tablas relacionadas, estudiantes , cursos y resultado . La siguiente consulta SELECT se crea agregando tres nombres de tabla después de la cláusula FORM y estableciendo las condiciones adecuadas en la cláusula WHERE para recuperar los datos de las tres tablas y generar una salida más apropiada que las consultas SELECT anteriores.

SELECCIONAR estudiantes.nombrecomo `Nombre del estudiante`, courses.namecomo `Nombre del curso`,
MAX(CASE WHEN result.mark_type ='Examen interno'ENTONCES resultado.marcas FIN) 'CONNECTICUT',
MAX(CASE WHEN result.mark_type ='Examen de mitad de período'ENTONCES resultado.marcas FIN) 'Medio',
MAX(CASE WHEN result.mark_type ='Final Exam'ENTONCES resultado.marcas FIN) 'Final',
SUMA(resultado.marcas) comoTotal
DE estudiantes, cursos, resultado
DONDE result.std_id = estudiantes.id y result.course_id = cursos.course_id
GROUP BY result.std_id, result.course_id
ORDER BY result.std_id, result.course_id ASC;

La siguiente salida se generará después de ejecutar la consulta anterior.

Conclusión:

En este artículo se muestra cómo puede implementar la funcionalidad de la función Pivot () sin el soporte de la función Pivot () en MySQL utilizando algunos datos ficticios. Espero que los lectores puedan transformar cualquier dato de nivel de fila en datos de nivel de columna usando la consulta SELECT después de leer este artículo.