【问题标题】:What are some solutions to normalizing data which has multiple values stored in 1 cell?有哪些解决方案可以规范化在 1 个单元格中存储多个值的数据?
【发布时间】:2016-11-05 09:56:07
【问题描述】:

我有一个包含 128 000 封独特电子邮件的 excel 文件。每封电子邮件可以有多个产品ID,但是,产品代码都存储在一个单元格中,用分号分隔。

   Email     Product_id
   XXXX@...  ;16;411;75;
   yyyy@...  ;3242;
   zzzz@...  ;58;411;16;65;24;

我想将产品数据标准化成一个单独的表格,如下所示:

email            product_id
XXXX@...         16
XXXX@...         411
XXXX@...         75
yyyy@...         3242
zzzz@...         58
zzzz@...         411
zzzz@...         16
zzzz@...         65
zzzz@...         24

有哪些可能的解决方案来规范化这些数据?我应该使用什么工具/程序?

【问题讨论】:

  • 您想在哪里存储这些数据?为什么这个问题被标记为“sql”?
  • 它不会存储在任何数据库中,但我对使用 MySQL/MS SQL 的可能解决方案感兴趣,因为我可以访问它们。应该说得更清楚对不起。
  • 向我们展示您的尝试,以及您遇到问题的地方。在 Excel 中,您可以使用Text-to-columns 来拆分数据;然后使用 Power PivotGet and Transform(取决于您的 Excel 版本)取消透视生成的 Product_ID 列
  • 嗨,克里斯!由于您是新来的,请给我一个提示:这个问题仍然悬而未决吗?如果解决了,最好在投票柜台下方勾选接受检查。这将 1) 将此问题标记为已解决 2) 让关注者更容易找到解决方案 3) 向回答者支付积分和 4) 向您支付积分。一旦你自己越过 15 点边界,你就会被要求对贡献进行投票。这是说谢谢的方式。如果它仍然打开,您可能会放置更多详细信息...快乐编码!

标签: sql excel normalization


【解决方案1】:

通过此 SQL-Server 查询,您可以获得所需的列表。您可以使用SELECT col1, col2 INTO NewTable FROM ... 语法将结果立即写入表中。

DECLARE @tbl TABLE(Email VARCHAR(100),Product_id VARCHAR(100));
INSERT INTO @tbl VALUES
 ('XXXX@...',';16;411;75;')
,('yyyy@...',';3242;')
,('zzzz@...',';58;411;16;65;24;');


WITH Splitted AS
(
    SELECT Email
          ,CAST('<x>'+REPLACE(Product_id,';','</x><x>') + '</x>' AS XML) AS ID_Splitted
    FROM @tbl AS tbl
)
SELECT EMail
      ,id_split.value('.','int') AS id
FROM Splitted
CROSS APPLY ID_Splitted.nodes('/x[text()!=""]') AS A(id_split);

结果

EMail       id
XXXX@...    16
XXXX@...    411
XXXX@...    75
yyyy@...    3242
zzzz@...    58
zzzz@...    411
zzzz@...    16
zzzz@...    65
zzzz@...    24

编辑

我有点快,因为没有提示,你想使用 SQL Server...

在 Excel 中有一个非常好的功能“列中的文本”。您可以在“数据”菜单中找到它。 (至少我的德语版本称之为“日期”和“Spalte 文本”)。在那里您可以定义一个分隔符(在您的情况下为分号)并自动将值拆分 side-by-side。某种unpivot 会创建一个one-below-the-other列表

【讨论】:

    猜你喜欢
    • 2012-07-15
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2010-11-09
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多