将 Excel 行转换为 SQL 列

Posted

技术标签:

【中文标题】将 Excel 行转换为 SQL 列【英文标题】:Convert Excel Rows Into SQL Columns 【发布时间】:2015-10-01 15:26:11 【问题描述】:

我有一个客户继承了一个 Excel 电子表格,其中包含一个邮件列表的联系信息。显然,他的前任试图格式化电子表格以打印 pin-feed 邮寄标签。它使用一列,并在单独的行中包含地址信息:

Name
Street Address
City, ST ZIP
Name
Street Address
City, ST ZIP
Name
Street Address
City, ST ZIP

我需要做的是将数据转换成列,分别为 City、ST 和 ZIP 列(用于运营商路线排序)。我最初的想法是使用 Pivot,但我似乎无法让它发挥作用。

此邮件列表中有 1,800 多个名称,因此手动修复它不是一种选择。我也有一个想法将它们导出为 CSV,然后使用一系列查找和替换操作来用逗号替换换行符,但这似乎是丛林联盟。必须有适当的数据解决方案。

想法?

谢谢,

ty

【问题讨论】:

也许 Excel vba 可以提供帮助:第一列 = 名称;第二地址线1;第三列字符串操作并移动到下一个名称列。 您在此处显示的格式是否总是如此?如果是,您可以运行某种脚本,将每 3 行换行符拆分为一条记录,然后在其中根据逗号位置拆分城市、st、zip 行。 正如 krish 所说,我会为此使用 vba。您可以简单地使用它相对轻松地生成 sql 插入脚本。您可以用它们分隔的任何值(很可能是逗号)来分割这些值。 【参考方案1】:

这是我的解决方案。它基于您所描述的结构是固定且一致的假设。

它是书面的 T-SQL (SQL Server)。将其转换为 my-sql 应该没有任何问题。

我反对 vba 解决方案。 SQL 已经足够强大了。

如果您很难实现这一点,我还有一些想法。 (我只是不确定 my-sql 中有什么可用的,必须检查一下)。无论如何 - 它应该可以工作。

--DROP TABLE Example_Table;

CREATE TABLE Example_Table 
   (
   Val     VARCHAR(1000),
   Row_Num INT IDENTITY(1,1)
   );

INSERT INTO Example_Table
    SELECT 'John' AS Val UNION ALL
    SELECT 'Elm St.' AS Val UNION ALL
    SELECT 'Tel Aviv, 151515' AS Val UNION ALL
    SELECT 'Doe' AS Val UNION ALL
    SELECT 'Manhatten St.' AS Val UNION ALL
    SELECT 'Jerusalem, 344343' AS Val UNION ALL
    SELECT 'Fox' AS Val UNION ALL
    SELECT 'Mulder St.' AS Val UNION ALL
    SELECT 'San Francisco, 3243424' AS Val UNION ALL
    SELECT 'Jean Lic' AS Val UNION ALL
    SELECT 'Picard St.' AS Val UNION ALL
    SELECT 'Enterprise City, 3904734' AS Val;

SELECT Name_Details.Val AS Name
     , Street_Details.Val AS Street
     , SUBSTRING(City_Details.Val, 1, CHARINDEX(',', City_Details.Val, 0) - 1) AS City
     , SUBSTRING(City_Details.Val, CHARINDEX(',', City_Details.Val, 0) + 2, LEN(City_Details.Val) - CHARINDEX(',', City_Details.Val, 0)) AS Zip
     , City_Details.Val AS City_And_Zip
FROM   Example_Table AS Name_Details
       INNER JOIN 
       (SELECT VAL, Row_Num FROM Example_Table AS E WHERE  Row_Num % 3 = 2) AS Street_Details
         ON (Street_Details.Row_Num = Name_Details.Row_Num + 1)
       INNER JOIN 
       (SELECT VAL, Row_Num FROM Example_Table AS E WHERE  Row_Num % 3 = 0) AS City_Details
         ON (City_Details.Row_Num = Name_Details.Row_Num + 2)
WHERE  Name_Details.Row_Num % 3 = 1 ;

DROP TABLE Example_Table;

【讨论】:

以上是关于将 Excel 行转换为 SQL 列的主要内容,如果未能解决你的问题,请参考以下文章

将我的日期列从 Excel 导入/转换为 SQL Server 中的日期时间数据类型?

Oracle SQL:将当前行和前两行的excel嵌套if条件转换为SQL

如何将Excel数据转换为SQL脚本

Excel2010表格行和列转换的方法

SQL把查询出的一个列转换成行

如何将 Excel 公式转换/模拟为 SQL 查询