归一化数据的一些解决方案有多个值存储在1个单元格中?

时间:2016-07-03 15:49:42

标签: sql excel normalization

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

   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

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

1 个答案:

答案 0 :(得分:0)

使用此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中有一个非常好的功能&#34;列中的文字&#34;。你可以在&#34; Data&#34;菜单。 (至少我的德语版本称之为&#34; Daten&#34;以及&#34; Spalte中的文字&#34;)。在那里,您可以定义分隔符(在您的情况下是分号)并自动获取并行分割的值。某种unpivot会创建一个一个低于其他列表