单元格内容作为' WHERE'的一部分。 Excel中的陈述

时间:2017-08-28 17:05:08

标签: sql sql-server excel tsql powerquery

我一直在寻找数星期但是在寻找以下问题的答案方面没有取得多大成功......

我可以在Excel中创建一个文本框(在开发人员选项中),然后让用户输入的文本框内容成为SQL(T-SQL)中WHERE语句的一部分吗?理想情况下,我希望用户能够输入一个3位数的ID号,然后点击搜索按钮,在相同或不同的表格上显示结果列表。如果一个文本框不简单,那么我将解决被引用的单元格的内容而不是文本框内容。

这样的事情:

SELECT T.CustomerName, T.NetAmount, T.TransactionType

FROM TheDatabase.dbo.TransactionsTable T

WHERE T.ScheduledDate > '2016-01-01' AND 
     (T.Status = 'InProcess' OR T.Status = 'Completed') AND
      T.CustomerID = [textbox1.contents / cell(A1).. something]

我知道SQL并不是设计成像这样工作,但我希望它能说明我想要实现的目标。

一些背景知识:

我正在将一些责任传递给同事,因为我正在转向另一个角色。我有一份定期运行的报告,它给出了有关应付账款交易的统计数据。我必须在晚上学习一些基本的SQL,并且在设计SELECT语句和学习时非常成功。问题是,每当我需要将新客户(基本上是一个3位数的数字)添加到我要查看的帐户列表中时,我必须修改查询。这对我来说没什么大不了的,我只需打开PowerQuery,选择高级视图,然后编辑代码。我不能为下一个人修复工具,所以我需要一种他们可以搜索他们想要的客户的方法。

我可以加载所有客户,但主表中有超过360万笔交易,我们会查看超过30个字段。 PLUS在3个数据库中至少有6个表,我将它们连接在一起以提取和计算所有信息。我最后一次尝试检索所有事务数据,因为我的系统内存不足而使我无法生产。我成功查询那么多数据的时间差不多只花了10分钟。老实说,这对我来说不是问题,但这个人必须一直运行这个,我需要加快速度。正如我所看到的,消除问题的唯一方法是仅提取我需要的事务。我现在这样做,需要3秒钟。

我一直在使用的查询是在Microsoft SQL Server Management Studio中创建的,我基本上复制了查询并将其粘贴到“高级版”中。在Excel中创建查询时的框。

无论是现在还是将来的项目,任何有关此建议的建议都会有所帮助!

1 个答案:

答案 0 :(得分:0)

在Excel VBA中,您可以打开与数据库的SQL连接。但是,您需要正确的权限和密码才能执行此操作。也许贵公司的技术人员可以为此提供帮助。

然后你需要构建你的SQL代码并发送它。然后检索结果。您可以通过多种方式显示结果。

以下是一些可以帮助您入门的代码:

    Set objMyConn = New ADODB.Connection
    Set objMyRecordset = New ADODB.Recordset

    Dim strSQLText As String   ' Declare a string to build your SQL in

    'Open your connection
    objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=TheDatabase;User ID=xyz;Password=xyz;"
    objMyConn.Open

    strSQLText = "SELECT T.CustomerName, T.NetAmount, T.TransactionType " & _
                 "FROM TheDatabase.dbo.TransactionsTable T " & _
                 "WHERE T.ScheduledDate > '2016-01-01' AND " & _
                 "(T.Status = 'InProcess' OR T.Status = 'Completed') AND " & _
                 "T.CustomerID = '" & _
                 Me.textbox1.Value & "';"

    Set objMyRecordset.ActiveConnection = objMyConn

    objMyRecordset.Open strSQLText            

    ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset)

此代码假定您的T.CustomerID是varchar。如果是整数(或其他数据类型),则需要从textbox1.Value

周围的SQLText中删除单引号

您可能还希望将结果保存在单元格“A1”以外的位置。有很多方法/地方可以显示结果。

此外,此代码假定textbox1.Value中只有一个ID。获取此SQL仅使用1个客户代码。如果您需要为多个客户返回数据,您可以稍后再花一点时间来完成。

希望能让你开始。