取消组合表,操纵列并转换为行

时间:2014-08-01 00:02:43

标签: mysql xml excel csv

我有一个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    |
| .......       | ........ | .....  |

在结果表中,牌照不是唯一值,并且它已经重复了它的概念数量。

UPD:刚刚发现它可以被称为非规范化数据(可能不完全正确)。

2 个答案:

答案 0 :(得分:0)

我会用MySQL做到这一点,方法如下:

将表格(将其转换为CSV后)导入MySQL。我们称之为 source

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

需要考虑的事项:

  1. 我将License_Plate声明为主键,仅基于您的示例。如果它在实际数据中重复,则可能不是这种情况。此外,如果同一牌照的源表上有多行,则可能需要调整我的3个查询以聚合值。
  2. 此外,数据类型会根据示例数据进行调整,例如,如果您的值超过8位,则可能需要更改数据类型。
  3. LOAD DATA是您上传CSV的一种方式。它有很多选项,你应该检查出来。你也可以用一些工具来做,以免写那个陈述。
  4. 最后,选择这些表名作为示例,您应该提出更好的表名,代表您的问题域。
  5. 希望这会对你有所帮助。

答案 1 :(得分:0)

@pnuts的评论帮助了我。这是非常简单的解决方案,可以在Excel中完成。谢谢!

解决方案是:Convert matrix to 3-column table ('reverse pivot', 'unpivot', 'flatten', 'normalize')