在 Excel 中从 SQL Server 导入之前动态过滤数据

Gri*_*fin 8 database spreadsheet sql microsoft-excel microsoft-excel-2013

我想弄清楚是否有办法在将 SQL Server 连接中的数据导入 Excel 之前对其进行过滤。初始导入无关紧要(建立连接时),但我需要 Excel 在随后打开时几乎没有数据,并且只有在选择参数后才导入相关数据。SQL 表可能有大量数据,性能是一个问题。

因此,如果我将数据导入表中,则应用过滤器,例如 Country 为 UK,关闭文件并在下周再次打开它,理想情况下它应该只查询和导入 UK 的数据。当我选择另一个国家时,它应该单独导入该国家/地区的数据。我需要从表中列举的选择。

现在,我不相信表格有这种能力。但是切片器、数据透视表、PowerView 或 PowerPivot 怎么样?

欣赏任何想法。

dav*_*dav 9

您绝对可以使用 Tables 以及 Powerpivot 和 Data Explorer 做到这一点。目前最简单也是我首选的方法是在 Excel 中创建参数化查询。为此,请使用查询向导并在最后为要传递的每个参数添加约束。完成此操作后,您可以编辑连接属性并分配要作为静态值、对话框或电子表格单元格返回的参数。

  1. 使用 MS Query 选择您的数据源 - 这是能够将参数传递回 SQL 所必需的;Data>Other Sources>Microsoft Query.
  2. 选择Data Source,在此处选择您的 SQL 数据源。在到达Finish窗口之前,我通常会将所有这些选项留空,然后我会选择View data or edit query in MS Query.
    • 注意:我通常会将我想要的 SQL 信息预处理到我可以连接到的单个视图中,但您通常可以传递任何选择语句。我还没有尝试过调用存储过程,所以我不确定它是如何工作的。
  3. 在 MS 查询窗口中,单击Show/Hide Criteria button并选择一个条件字段。这将调用您的参数传递回 SQL。
    • 示例:如果您有一个日期字段并在 Criteria 字段中选择它,然后添加一个介于 [开始] 和 [结束] 之间的值。这将创建一个参数,MS Query 将要求您填写这两个值并立即返回适当的数据集。如果你检查它创建的 SQL 语句,它会添加一个 WHERE(datasource.dateBetween ? and ?) 子句。
  4. 选择“文件”>“将数据返回到 Excel”,然后选择“表格”。
  5. 要让表格自动提取您的查询参数,请在表格中选择一个单元格,然后转到数据>属性>连接属性>定义>参数。
  6. 对于每个参数,您可以选择它
    1. 提示您提供一个值;或者
    2. 使用特定值;或者
    3. 从电子表格单元格中获取值,可选择在单元格值更改时自动更新表格数据。
      • 作为附加选项,您可以在为参数选择的单元格上使用数据验证,从而限制可供选择的可能值。您甚至可以让验证单元格来自一个表格,该表格由您的数据库中的值提供,确保只能选择数据库中保存的值。
  7. 为每个参数设置参数值,然后在所有对话框中单击“确定”。
  8. 最后,为了最小化文件大小,在连接属性>使用选项卡中,您可以选择打开文件时刷新数据和保存工作簿前从外部范围中删除数据。这将在文件未主动使用时转储连接的数据,从而最小化文件大小。

我经常会根据从参数化查询提供的表来创建数据透视表,以返回自动更新的特定日期范围(例如前 6 个月)的值。

编辑: 要返回多个值以在 SQL IN 子句中使用,您只需修改 MS 查询框中的条件窗口。例如,如果您有一个 Country 字段名称,请在 Criteria 字段中选择它,然后为值输入 IN([First],[Second],[Third])。选择 Return Data to Excel,MS Query 将要求手动输入值。回到 Excel 后,您可以再次修改参数,并将它们指向电子表格中的三个单元格,每个单元格都可以通过数据验证进行约束。虽然您可以像这样传递多少个参数可能有限制,但 Excel 可以轻松处理三个,因此不可能再增加几个。

  • 只是为了回答您自己的小问题,绝对可以使用存储过程。但要注意的主要事情是您正在验证的用户必须在 SQL Server 级别对其具有执行权限。 (2认同)