多表间动态列名导入mysql

jdzmm42g  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(313)

我导入了一个名为book1的表,其列名为:id,2018m01,2018m02,2018m03
我现在需要导入第二个名为book2的表,其列名为:id,2018m05,2018m06,2018m07
两个表中的列名之间有一些相似之处,即前缀year 2018。
如果可能的话,我不希望继续为每个表的每个列名编写这部分代码,如下所示

CREATE TABLE book1 (
    ID VARCHARACTER(10),
    2018M01 decimal(4,2),
    2018M02 decimal(4,2),
    2018M03 decimal(4,2)
);

实际上,实际的表有几个列。
下面编写的代码考虑了第一个表和一些动态节代码,但是我需要一些关于第二个导入表的帮助。

DROP TABLE IF EXISTS book1;

CREATE TABLE book1 (
    ID VARCHARACTER(10),
    2018M01 decimal(4,2),
    2018M02 decimal(4,2),
    2018M03 decimal(4,2)
);

LOAD DATA LOCAL INFILE '/Users/blytonpereira/Desktop/Book1.csv' REPLACE INTO TABLE book1 
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES;

SELECT
  GROUP_CONCAT(
    CONCAT(
      'SELECT id, ''', COLUMN_NAME, ''' as month, ', COLUMN_NAME, ' as QTY FROM t1 ') SEPARATOR ' UNION ALL ')
FROM
  `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE
  `COLUMN_NAME` LIKE '2018%'
INTO @sql;

SET @query = CONCAT('select id, month, QTY from (' , @sql , ') x order by id;');

SELECT @query;

 PREPARE stmt FROM @query;
 EXECUTE stmt;

我希望避免为每个导入显式定义列名。我正在进行的每个导入都是相似的,但略有不同,即列名每次都在更新,例如在第一个表中是2018m01..2018m02…2018m03….在第二个表中是2018m02..2018m03..2018m04。我需要一些帮助来编写代码的第二部分,在这里导入第二个文件

1mrurvl1

1mrurvl11#

这只是一个建议,显然没有测试和一些固有的假设。
看起来可以将每个文件加载到同一个表中,从而避免使用动态列名。i、 你忽略了最上面的一行,我认为它有列名

LOAD DATA LOCAL INFILE '/Users/blytonpereira/Desktop/Book1.csv' REPLACE INTO TABLE book1 
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES;

所以“分段”可以这样定义:

CREATE TABLE book_staging (
    ID VARCHARACTER(10),
    MNTH_A decimal(4,2),
    MNTH_B decimal(4,2),
    MNTH_C decimal(4,2)
);

你可以用参数设置一个固定的查询,就像这样

set @mnth_a = '2018M04';
set @mnth_b = '2018M05';
set @mnth_c = '2018M06';

select id, month, QTY 
from (
    SELECT id, @mthn_a as month, MNTH_A as QTY FROM book_staging WHERE MNTH_A IS NOT NULL
    UNION ALL 
    SELECT id, @mnth_b as month, MNTH_B as QTY FROM book_staging WHERE MNTH_B IS NOT NULL
    UNION ALL 
    SELECT id, @mnth_b as month, MNTH_C as QTY FROM book_staging WHERE MNTH_C IS NOT NULL
    ) x 
order by id, month
;

在加载文件的每个周期结束时,可以截断或删除临时表(取决于首选方法),以便为下次运行做好准备。
正如一个观察,列名也是函数名或保留字,使用起来很痛苦。我个人不会使用列名 month . 类似地,我更愿意使用像2018-01-01这样的真实日期,而不是像2018m01这样的字符串,但使用这些字符串可能还有其他原因我不知道。

相关问题