Mysql 解组表格、操作列并转换为行

Mysql 解组表格、操作列并转换为行,mysql,xml,excel,csv,Mysql,Xml,Excel,Csv,我有一个Excel表格,可以转换为XML或CSV,用于处理此结构: | License-plate | Parking | Fuel | Cleaning | --------------------------------------------- | 1111AAA | 234 | 21 | 1244 | | 2222AAA | 22 | 12 | 644 | | 3333BBB | 523 | 123

我有一个Excel表格,可以转换为XML或CSV,用于处理此结构:

| License-plate | Parking | Fuel | Cleaning |
---------------------------------------------
| 1111AAA       | 234     | 21   | 1244     |
| 2222AAA       | 22      | 12   | 644      |
| 3333BBB       | 523     | 123  | 123      |
这是每月每辆车的停车费、燃油费等支出

车牌是表中唯一的值

我需要在这里转换此表以将其导入MySQL,但我不知道如何进行转换,也不知道哪个工具适用于此:

| License-plate | Concept  | Amount |
-------------------------------------
| 1111AAA       | Parking  | 234    |
| 1111AAA       | Fuel     | 21     |
| 1111AAA       | Cleaning | 1244   |
| 2222AAA       | Parking  | 22     |
| 2222AAA       | Fuel     | 12     |
| 2222AAA       | Cleaning | 644    |
| .......       | ........ | .....  |
在结果表中,License plate不是唯一的值,它会根据其拥有的概念数量重复出现


UPD:刚刚发现它可以被称为非规范化数据,可能不完全是这样。

我会用MySQL实现它,方法如下:

将表转换为CSV后导入MySQL。让我们称之为源头

创建另一个具有所需最终结构的表,我们称之为destination

执行以下查询

需要考虑的事项:

根据您的示例,我声明License_Plate为主键。如果它在真实数据中重复,则可能不是这种情况。此外,如果同一车牌的源表中有多行,则可能需要调整my 3查询以聚合值。 此外,数据类型会根据样本数据进行调整,例如,如果值超过8位,则可能需要对其进行更改。 是上传CSV的一种方式。它有很多选择,你应该去看看。您还可以使用一些工具来完成,这样就不会编写该语句。 最后,选择这些表名作为示例,您应该找到更好的表名,它们代表您的问题域。
希望这对你有所帮助。

@pnuts的评论对我有所帮助。这是一个非常简单的解决方案,可以在Excel中完成。谢谢大家!


解决方案是:

你有这么多的专栏,你不能只是复制和粘贴吗?@Manufactor,是的,有很多专栏,我必须每月做一次。@pnuts谢谢!这很有帮助。这真是一个很好的解决方案。非常感谢你!谢谢你的建议。看起来应该有用,但可能是我做错了什么。我试图先只运行查询的一部分,但在第1行出现“get Column count”与“value count”不匹配的错误。@user3830159我已扩展我的答案,以包括表创建和上载CSV的可能方式。如果在尝试上载文件时发生此错误,请检查Excel是否在每行后面添加了逗号。MySQL可以将其解释为另一个不存在的字段。谢谢!我知道如何创建表,并且我已经插入了要手动测试的数据。我终于可以让它工作了。我想这是由于id字段引起的。我把它删掉了。它是有效的。非常感谢你!
CREATE TABLE source (
  License_Plate char(7) primary key,
  Parking int(8) unsigned,
  Fuel int(8) unsigned,
  Cleaning int(8) unsigned
);

LOAD DATA INFILE 'path/to/file' INTO TABLE source FIELDS TERMINATED BY ',';
CREATE TABLE destination (
  License_Plate char(7),
  Concept varchar(10),
  Amount int(8) unsigned
);
INSERT INTO destination
SELECT License_Plate, 'Parking' as Concept, Parking as Amount
FROM source

INSERT INTO destination
SELECT License_Plate, 'Fuel' as Concept, Fuel as Amount
FROM source

INSERT INTO destination
SELECT License_Plate, 'Cleaning' as Concept, Cleaning as Amount
FROM source