【问题标题】:MS Excel - join external (SQL) data with local table (sheet)MS Excel - 将外部(SQL)数据与本地表(工作表)连接起来
【发布时间】:2022-03-02 07:22:41
【问题描述】:

我正在尝试从外部源和我的 Excel 文件的另一张表中获取数据到一个表中。 我在 SQL Server 中拥有的是我的客户表: ╔════╦══════╦═════════╗ ║ ID ║ Name ║ Country ║ ╠════╬══════╬═════════╣ ║ 1 ║ Joe ║ Spain ║ ║ 2 ║ Bob ║ Frence ║ ║ 3 ║ Eva ║ Spain ║ ╚════╩══════╩═════════╝ 我的 Excel 文件的另一张表中列出了国家和税收: ╔═════════╦═════╗ ║ Country ║ VAT ║ ╠═════════╬═════╣ ║ Germany ║ 19% ║ ║ Frence ║ 20% ║ ║ Spain ║ 21% ║ ╚═════════╩═════╝ 最后我需要的是一张包含我的客户和他应该支付的税款的表格。该表应该在我的 excel 文档的一张表中,并且用户应该能够根据需要轻松更新它。 ╔══════════╦═════╗ ║ Customer ║ VAT ║ ╠══════════╬═════╣ ║ Joe ║ 21% ║ ║ Bob ║ 20% ║ ║ Eva ║ 21% ║ ╚══════════╩═════╝ 知道什么是一个不错且简单的解决方案吗?

我尝试了两个 excel sql 查询 - 一个来自 SQL Server,第二个来自“microsoft query”(来自 excel 文件)。但由于后续无法运行,无法确定一次更新后的数据是否正确。

我还尝试了一个 sql 查询(来自 SQL Server)和一个 VLOOKUP 公式。但是填表后不会自动计算公式。

【问题讨论】:

  • 据我了解,您有两个表 - 一个在 SQL Server 端,另一个在 Excel 工作表上,您想将它们加入另一个 Excel 工作表。我对吗?您还写道,用户将输入一些数据(我想是在 Excel 中)并且连接表应该按需更新 - 一些按钮将被按下或如何?
  • 为什么不将所有工作表导入SSMS,然后使用SQL 做你想做的事。
  • 因此,您想在打开工作簿时从 SQL 中提取客户数据(从而获得新客户),然后重建客户增值税工作表,并可选择在客户刷新时重建客户增值税工作表?
  • 您可以将新数据上传到 SQL 并全部获取,您可以使用 PowerQuery,您可以获取 SQL 数据并粘贴,然后获取其他数据并粘贴,您可以转换工作表数据到 SQL 上的 TempTable 或 TableVariable,然后将所有数据放在一起。这些只是几个选项。解决方案取决于要求和选项(速度、主数据管理、数据量、与 SQL 的连接速度等)。所以,请更具体一点。该帖子(在当前状态下)非常广泛。
  • @gofr1,是的,你理解正确。用户可以更改 Excel 表 - Country-VAT 表。关于“按需更新”——如果我使用 excel 开箱即用的工具“来自其他来源的数据”,则“刷新数据”按钮已经存在。

标签: sql-server excel powerquery


【解决方案1】:

我上面的评论只是为了打开你手头可能有的一些可能性。

PowerQuery 是 Office 2013 的免费插件。在 Office 2016 中,它是 Excel 的一部分,不再是插件。

无论如何,您似乎更喜欢在 SQL 上使用临时表或表变量的方法。因此,我将详细说明这种方法:

最后你会想要一个类似于这个的查询:

set nocount on;
declare @tblVAT table
    (
     Country nvarchar(50),
     VAT decimal(9, 7)
    );

insert  into @tblVAT
        (Country, VAT)
values  (N'Germany', 0.19),
        (N'Frence', 0.20),
        (N'Spain', 0.21);


select  tc.Name,
        tc.ID,
        case when tc.Country is null then tv.Country
             else tc.Country
        end as Country,
        tv.VAT
from    dbo.tblCustomers as tc
full outer join @tblVAT as tv
on      tv.Country = tc.Country;

注意set nocount on;在上述SQL查询开头的重要性。没有它就行不通!

一旦有了这个查询,您就可以使用菜单DataGet External DataFrom SQL Server 将其粘贴到 Excel 中。在第一步中,您将获得客户表,然后在第二步中细化查询以包含上述表变量。这是一个简短的视觉摘要:

我想,此时剩下的唯一问题是:

  1. 如何动态创建上述SQL语句和
  2. 如何在 Excel 中获取上表,然后使用更新后的 SQL 语句进行更新。

要动态创建上述 SQL,您可能需要查看以下内容:Using an array or dictionary as from clause in sql in excel vba

就在昨天,我回答了一个类似的问题,用户希望将 Excel 工作表的内容作为动态创建的表传递给 SQL Server。您可以根据自己的目的轻松调整(甚至按原样使用)。

对于最后一步(使用这个新的 SQL 查询在 Excel 中更新此表),您可以使用宏记录器并执行我在上面的屏幕截图中所做的操作。自动创建的代码与我向您建议的一样多/少。

所以,你有它。如果我不够清楚,或者您需要更多详细信息来理解此解决方案,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    相关资源
    最近更新 更多