MySQL - Carga masiva de .csv y reestructuración de columnas para exportar

 
Vista:

Carga masiva de .csv y reestructuración de columnas para exportar

Publicado por Rvm (3 intervenciones) el 13/08/2021 18:25:34
Hola a tod@s,

soy nuevo por aquí y comenzando con SQL. Os agradecería mucho que pudierais ayudarme a resolver la siguientes de dudas, de lo que será mi primer "proyecto" de práctica.

Duda: modificar la estructura de datos en las columnas.
crear script para aplicar dicha modificación a todo el lote de 100-150 .csv una vez cargados.

Origen de datos:

cada tabla .csv se corresponde con un mes del año obtenida de una base de datos abierta en internet.
Estructura de la tabla
>Columnas: flujo (TEXT E /I), año( Varchar 20XX), mes (int XX), estado (TEXT), pais (int XXX), provincia (int), euros (decimal), dolares (decimal), nivel_taric (int X), cod_taric (int XXX), kilogramos (decimal)

Datos una vez cargados en MySQL 8.0

Para cargar uno de los .csv a modo de prueba ejecuté lo siguiente:

1
2
3
4
5
6
7
8
9
SET SESSION sql_mode = ''; SET GLOBAL local_infile=1;
 
USE avodb;
 
LOAD DATA INFILE 'C:\comex_taric_201810.csv'
INTO TABLE avotable
FIELDS TERMINATED BY '\t' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

Ahora, quiero filtrar toda la información en función de Flujo= I y cod_taric= 080440. Y mostrar solo algunas de las columnas, para esto ejecuté lo siguiente:

1
2
3
4
SELECT flujo, año, mes, pais, euros, cod_taric, kilogramos
FROM avodb.avotable
WHERE cod_taric = 080440 AND flujo = 'I'
ORDER BY kilogramos, pais;
.

Hasta aquí todo mas o menos en orden.

Ahora vienen mis dudas.
1º) Si tengo otro archivo correspondencias.csv con las correspondencias en Texto para la variable pais y cod_taric,
¿cómo podría mostrar en mi BD dichos valores sustituidos por el texto que le corresponde según correspondencias.csv?

2ª) necesito exportar mi BD filtrada con la estructura siguiente. ! con 2 columnas nuevas
Columnas: Pais (Texto), euros (decimal), cod_taric (int XXX), mes / 20XX (que muestre Kg (decimal)) , total 20XX (que muestre Kg (decimal)

3º) qué script debería ejecutar junto con el LOAD DATA INFILE para cargar todos los .csv?

4º) qué script debería ejecutar junto con SELECT FROM WHERE, para obtener la nueva estructura de la base de datos del punto 2º?

Muchisimas gracias por adelantado por vuestra ayuda y tiempo!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Carga masiva de .csv y reestructuración de columnas para exportar

Publicado por Rvm (3 intervenciones) el 13/08/2021 21:28:48
Solución para pregunta nº 3:

Como todas las tablas .csv son de igual estructura, las guardé en la misma carpeta y ejecuté mediante CMD como administrador dentro la carpeta en cuestión lo siguiente:

1
copy *.csv nombre_destino.csv

de esta manera, todos los .csv que voy utilizar se copian automaticamente en un solo archivo csv. listo para ser importado en MySQL.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Carga masiva de .csv y reestructuración de columnas para exportar

Publicado por Rvm (3 intervenciones) el 16/08/2021 00:07:33
CASI solucionado pregunta 4ª y 2ª

LA SUMA devuelta es INCORRECTA.

esta es la sintaxis que estoy probando para obtener una consulta: cod_pais, Octubre_2018, noviembre_2018,

donde cada columna de cada mes debería ser la suma de kilogramos, según la condición aplicada.


1
2
3
4
5
6
SELECT avotable.cod_pais,
  SUM(CASE WHEN mes = '10' AND año = '2018' AND flujo = 'I' THEN avotable.kilogramos ELSE 0 END) AS Octubre_2018,
  SUM(CASE WHEN mes = '11' AND año = '2018' AND flujo = 'I' THEN avotable.kilogramos ELSE 0 END) AS noviembre_2018
FROM avodb.avotable
WHERE cod_taric = 080440 AND flujo = 'I'
GROUP BY cod_pais;

el problema es que al comprobar manualmente la suma, no concuerda con el resultado obtenido en mi consulta.

alguien tendría una idea de lo que pueda estar ocurriendo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar