【问题标题】:ungroup table, manipulate columns and convert to a row取消分组表,操作列并转换为行
【发布时间】:2014-09-24 02:30:40
【问题描述】:

我有一个这种结构的 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:刚刚发现它可以称为非规范化数据(可能不完全是)。

【问题讨论】:

  • 你的栏目多到无法复制粘贴吗?
  • @Fabricator,是的,有很多专栏,我必须每月做一次。
  • @pnuts 谢谢!这有帮助。这真是一个很棒的解决方案。非常感谢!

标签: mysql xml excel csv


【解决方案1】:

我会用 MySQL 来做,方法如下:

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

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 ',';

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

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. 最后,选择这些表名作为示例,您应该想出更好的名称来代表您的问题域。

希望对你有所帮助。

【讨论】:

  • 感谢您的建议。看起来它应该可以工作,但可能是我做错了什么。我尝试先只运行查询的一部分,然后得到"Column count doesn't match value count at row 1" 错误。
  • @user3830159 我已经扩展了我的答案,包括创建表和上传 CSV 的可能方式。如果在您尝试上传文件时发生该错误,请检查 Excel 是否在每一行后添加了逗号。 MySQL 可以将其解释为另一个(不存在的)字段。
  • 谢谢!我知道如何创建表格,并且我已经手动插入数据进行测试。最后我可以让它工作。错误是因为我想是 id 字段。我已经删除了。它有效。非常感谢!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多