Ejemplo detallado de construcción de conversión de filas y columnas en un almacén de datos

Este artículo se comparte desde la comunidad de la nube de Huawei " Serie SQL de base de datos GaussDB: conversión de filas y filas " por Gauss Squirrel Club Assistant 2.

I. Introducción

Al construir un almacén de datos o realizar análisis de datos, la estructura de los datos originales debe procesarse hasta cierto punto. A veces implica "convertir filas en columnas" y otras "convertir columnas en filas". Entonces, ¿cuáles son las dos? ¿Métodos de conversión específicamente?¿Cuál es la diferencia y cómo implementarlo?Hoy usaremos la base de datos GaussDB como ejemplo para explicártelo.

2. Breve descripción

1. Concepto de fila a columna

Es decir, convertir datos de varias filas y una columna en una fila y varias columnas para su visualización. Por lo general, después de la conversión, el valor clasificado de una determinada columna se utiliza como el nombre de la nueva columna y se muestran varias filas de datos correspondientes a este valor en una fila.

cke_130.png

2. Concepto de columna a fila

Es decir, convertir datos de una fila y varias columnas en varias filas y una columna para su visualización. Por lo general, el nombre de la columna convertida es el valor de una determinada columna en una determinada fila para identificar los datos originales correspondientes.

cke_131.png

3. Ejemplo de experimento de conversión de filas y columnas en la base de datos GaussDB

Tomemos como ejemplo la puntuación de un estudiante: desde la perspectiva de un profesor, al introducir las puntuaciones, el profesor de cada materia introducirá por separado la puntuación de pregrado de cada estudiante. Desde la perspectiva del estudiante, a los estudiantes solo les importan sus calificaciones en cada materia. Por lo tanto, si los datos ingresados ​​por el maestro se usan como la tabla original, entonces los estudiantes usarán fila por columna cuando verifiquen sus propios puntajes. Si se les pide a los estudiantes que informen sus puntajes en cada materia, y luego cuando el maestro verifique los puntajes de las pruebas. de estudiantes en las materias correspondientes, será la columna Cambio de carrera.

1. Ejemplo de fila a columna

1) Cree una tabla de experimentos (tabla de almacenamiento de filas)

--Crear tabla de experimentos (tabla de almacenamiento de filas) 

CREAR TABLA calificación ( 

nombre VARCHAR(10) 

, curso VARCHAR(10) 

, puntuación INT); 

--Inicializar datos de prueba 

INSERTAR EN VALORES de calificación ('Zhang San','Matemáticas',80 ); 

INSERTAR EN VALORES de grado ('Zhang San','Inglés',88); 

INSERTAR EN VALORES de grado ('Zhang San','Chino',95); 

INSERTAR EN VALORES de grado ('Li Si','Matemáticas', 88); 

INSERTAR EN VALORES de calificación ('李思','Inglés',70); 

INSERTAR EN VALORES de calificación ('李思','Chino',93); 

--Ver resultados 

SELECCIONAR * DE la calificación ORDENAR POR curso;

cke_132.png

2) Conversión estática de fila a columna

--Fila estática a columna 

SELECCIONAR nombre 

, suma (caso cuando curso = 'Matemáticas' luego puntaje 0 final) COMO "Matemáticas" 

, suma (caso cuando curso = 'Inglés' luego puntaje 0 final) COMO Inglés 

, suma (caso cuando curso = 'chino' entonces la puntuación es 0, finaliza) COMO chino 

DEL 

GRUPO de grado POR nombre;

Utilice suma y caso cuando:

cke_133.png

3) De fila a columna (valor de resultado: empalme)

Utilice listagg dentro del grupo:

--Fila a columna (valor de resultado: concatenación) 

SELECCIONAR nombre, LISTAGG(puntuación,',') DENTRO DEL GRUPO (ORDENAR POR curso) DESDE la calificación GRUPO POR nombre;

cke_134.png

4) Conversión dinámica de fila a columna (estilo SQL de empalme)

Logrado a través de "listagg + crear FUNCIÓN + VER"

--Conversión dinámica de fila a columna (concatenación SQL) 

SELECT listagg(concat('SUM(CASE WHEN curso = ''', curso, ''' ENTONCES puntuación ELSE 0 END) AS "', curso,'"'),' ,') DENTRO DEL GRUPO(ORDENAR POR 1) COMO concat_text DESDE (SELECCIONAR curso DISTINTO DESDE el grado); 

--resultados de concat_text: 

SUM(CASE CUANDO curso = 'Matemáticas' ENTONCES puntuación ELSE 0 END) COMO "Matemáticas",SUM(CASE CUANDO curso = 'Inglés' ENTONCES puntúe ELSE 0 FINAL) COMO "Inglés",SUM(CASE WHEN curso = 'Chino' ENTONCES puntue ELSE 0 FINAL) COMO "Chino" --Crear una función 

. 

CREAR O REEMPLAZAR FUNCIÓN fun_test() 

DEVUELVE VOID 

IDIOMA SQL 

COMO $$ DECLARAR 

texto s_sql; 

registro rec; 

COMENZAR 

s_sql := 'SELECCIONAR listagg(CONCAT(''SUM(CASE WHEN curso = '''''', curso, '' '''' ENTONCES puntuar ELSE 0 END) COMO "'', curso, ''"'' ),'','' ) DENTRO DEL GRUPO(ORDENAR POR 1) AS concat_text FROM (SELECCIONAR curso DISTINTO DESDE el grado);'; 

EJECUTAR s_sql EN rec; 

s_sql := 'SOLTAR LA VER SI EXISTE v_score; CREAR VER v_score COMO SELECCIONAR nombre, ' || rec.concat_text || ' DESDE el GRUPO de calificaciones POR nombre;'; EJECUTAR 

s_sql; 

FINALIZAR $$; 

--Llamar 

LLAMADA fun_test(); 

--Ver resultados de ejecución 

select * from v_score;

cke_135.png

Consejo: preste atención a las comillas simples y dobles al escribir SQL.

2. Ejemplo de columna a fila

1) Cree una tabla de experimentos (reutilice los datos de prueba anteriores)

--Crear una tabla de experimentos (reutilizar los datos de la prueba anterior) 

CREAR TABLA grado1 COMO 

SELECCIONAR nombre 

, suma (caso cuando curso = 'Matemáticas' luego puntaje 0 final) COMO "Matemáticas" 

, suma (caso cuando curso = 'Inglés' entonces puntuación de lo contrario 0 final) COMO inglés 

, suma (caso cuando curso = 'chino' luego puntuación de lo contrario 0 final) COMO chino 

DEL 

GRUPO de grado POR nombre; 

-Ver resultados 

SELECCIONAR * DE grado1;

cke_136.png

2) Utilice union all para integrar cada materia (matemáticas, inglés, chino) en una columna

--Use unión todo para integrar cada materia (matemáticas, inglés, chino) en una columna 

SELECCIONAR * DESDE 

( 

SELECCIONAR nombre, curso 'Matemáticas' AS, puntaje de matemáticas COMO DEL grado 1 

unión todo 

SELECCIONAR nombre, curso 'Inglés' AS, Inglés AS puntuación DESDE grado1 

unión todos 

SELECCIONAR nombre, '中文' COMO curso, 中文AS puntuación DESDE grado1 

) 

ordenar por nombre;

cke_137.png

4. Resumen

La conversión de filas y columnas se utiliza a menudo en algunos escenarios de uso de bases de datos, como análisis de datos, construcción de almacenes de datos, etc. Sin embargo, cada software de base de datos tiene diferentes métodos de procesamiento, pero la idea básica de cambiar filas y columnas es la misma. Este artículo utiliza principalmente datos de GaussDB como plataforma y le brinda una breve introducción, puede probarlo.

Haga clic para seguir y conocer las nuevas tecnologías de Huawei Cloud lo antes posible ~

Alibaba Cloud sufrió un fallo grave y todos los productos se vieron afectados (restaurados). Tumblr enfrió el sistema operativo ruso Aurora OS 5.0. Se presentó la nueva interfaz de usuario Delphi 12 y C++ Builder 12, RAD Studio 12. Muchas empresas de Internet contratan urgentemente programadores de Hongmeng. Tiempo UNIX está a punto de entrar en la era de los 1.700 millones (ya entró). Meituan recluta tropas y planea desarrollar la aplicación del sistema Hongmeng. Amazon desarrolla un sistema operativo basado en Linux para deshacerse de la dependencia de Android de .NET 8 en Linux. El tamaño independiente es reducido en un 50%. Se lanza FFmpeg 6.1 "Heaviside"
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/4526289/blog/10141619
Recomendado
Clasificación