这个问题是关于mysql的。我正在从一个.csv文件中读取如下所示的数据
原始表格
------------------------------------
Id 2018M01 2018M02 2018M03
------------------------------------
EMEA 3 1 4
ASPAC 4 5 4
ASPAC 1 2 1
预期结果
---------------------
ID Month Qty
---------------------
EMEA 2018M01 3
EMEA 2018M02 1
EMEA 2018M03 4
ASPAC 2018M01 4
.......
“月份”列标题是动态的,即每个月都会有新月份,旧月份将被删除。但是,列的总数将保持不变。
因此,每当month列标题更改时,我都希望sql代码能够动态读取并提供正确的结果,而无需手动更改代码的几个部分。
我写了以下代码;代码是取消月份列的IVOT。不过,我测试了代码,手动更改了.csv文件头,将2018m03更改为2018m04,然后重新运行sql代码,但它似乎仍然打印旧数据。我做错什么了?
谢谢您。我对sql相当陌生。
DROP TABLE IF EXISTS book;
CREATE TABLE book (
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 book
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES;
DESCRIBE book;
SELECT ID, '2018M01' AS month, 2018M01 AS qty from book
UNION ALL
SELECT ID, '2018M02' AS month, 2018M02 AS qty from book
UNION ALL
SELECT ID, '2018M03' AS month, 2018M03 AS qty from book;
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'select ID, ''',
c.column_name,
''' AS month, ',
c.column_name,
' as qty
from book
where ',
c.column_name,
' > 0'
) SEPARATOR ' UNION ALL '
) INTO @sql
FROM information_schema.columns c
where c.table_name = 'book'
and c.column_name not in ('id')
order by c.ordinal_position;
SET @sql
= CONCAT('select id, month, qty
from
(', @sql, ') x order by id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
);
1条答案
按热度按时间piah890a1#
**更新的答案:这个解决方案是动态的,不管您在表中有什么列,它都将填充它们并以所需的格式提取信息。当然,列必须有一些共同点,比如它们都以“2018”开头,您可以在查询中根据需要进行更改。
**注意:查询有两个输出,第一个是准备好的连接查询字符串(只是为了在运行之前知道它是什么样子),另一个是实际数据。如果只需要实际数据,可以添加注解(选择@query;)或者移除它。