连接到自定义 SQL 查询

注意:使用自定义 SQL 可能会影响工作簿的性能。与您的 DBA 合作将确保获得最佳的自定义 SQL 查询。为了执行在 Tableau Desktop 中构建视图所需的操作,Tableau 必须能够控制 WHERE、GROUP BY 和其他 SQL 子句。由于自定义 SQL 查询可能包含这些元素,并且 Tableau 无法将它们注入到现有 SQL 中,因此 Tableau 必须将自定义 SQL 语句包含在 select 语句中。当自定义 SQL 连接执行缓慢或产生错误时,这通常是 Tableau Desktop 执行的自定义 SQL 包装的结果。

对于大多数数据库,您可以连接到特定查询,而非整个数据集。因为数据库的 SQL 语法彼此略有不同,所以您连接到一个数据库和连接到另一个数据库时,分别使用的自定义 SQL 或许也不相同。但是,如果准确知道所需信息并且知道如何编写 SQL 查询,则使用自定义 SQL 可能很有用。

尽管您使用自定义 SQL 可能有多种常见原因,但您可以使用自定义 SQL 跨表合并数据、重新转换字段以执行跨数据库联接、重构或减小数据大小以进行分析等。

对于 Excel 和文本文件数据源,此选项仅在 Tableau Desktop 8.2 之前创建的工作簿中可用,或者在通过旧版连接在 Windows 上使用 Tableau Desktop 时可用。若要使用旧版连接来连接到 Excel 或文本文件,请连接到文件,并在“打开”对话框中单击“打开”下拉菜单,然后选择“使用旧版连接打开”

注意:从 Tableau 2020.2 开始,不再支持旧版 Excel 和文本连接。请参见 Tableau 社区中的 Legacy Connection Alternatives(旧版连接替代方案)文档,了解使用旧版连接的替代方案。

连接到自定义 SQL 查询

  1. 连接到数据后,双击“数据源”页面上的“新建自定义 SQL”选项。

  2. 在文本框中键入或粘贴查询。查询必须是单个 SELECT* 语句。

  3. 完成后,单击“确定”

单击“确定”时,查询将运行,并且自定义 SQL 查询表将显示在画布的逻辑层中。只有自定义 SQL 查询中相关字段才会显示在“数据源”页面上的数据网格中。

有关画布的逻辑层和物理层的详细信息,请参见Tableau 数据模型

自定义 SQL 查询的示例

垂直合并表(合并)

如果需要彼此相互附加数据,则可以直接在 Tableau 中画布的物理层中使用合并选项。在某些情况下,您的数据库不支持此选项,因此您可以改用自定义 SQL。

例如,假设您具有以下两个表:November 和 December。

NovemberDecember

您可以使用以下自定义 SQL 查询将第二个表 December 附加到第一个表 November:

SELECT * FROM November UNION ALL SELECT * FROM December

查询结果在数据网格中如下所示:

有关合并选项的详细信息,请参见合并数据

更改字段的数据类型以执行跨数据库联接

要在画布的物理层中的两个表之间执行联接时,您在其上联接的字段的数据类型必须相同。如果字段的数据类型不相同,则您可以在执行联接之前使用自定义 SQL 更改数据类型(转换)字段。

例如,假设您要分别使用“根”和“ID”字段联接“Main”和“Sub”这两个表。“根”字段是数字类型,“ID”字段是字符串类型。您可以使用以下自定义 SQL 查询将“根”的数据类型从数字更改为字符串,以便可以使用“根”和“ID”字段联接“Main”和“Sub”表。

SELECT [Main].[Root] AS [Root_Number]
CAST([Main].[Root] AS INT] AS [Root_String]
FROM [Main]

此查询的结果显示原始“根”字段以及转换为字符串的“根”字段。

有关联接和跨数据库联接的详细信息,请参见联接数据

减小数据的大小

在使用非常大的数据集时,如果先减小数据大小,则有时您可以在处理数据时节省时间。

例如,假设您有一个名为 FischerIris 的大表。您可以使用以下自定义 SQL 查询来检索指定的列和记录,从而减少您从 Tableau 连接到的数据集的大小。

SELECT
[FischerIris].[Species] AS [Species],
[FischerIris].[Width] AS [Petal Width],
COUNT([FischerIris].[ID]) AS [Num of Species]
FROM [FischerIris]
WHERE [FischerIris].[Organ] = 'Petal'
AND [FischerIris].[Width] > 15.0000
GROUP BY [FischerIris].[Species], [FischerIris].[Width]

重新构建您的数据(转置)

在某些情况下,您可能要使用需要在分析之前重新构建的表。虽然这种类型的任务可以在 Tableau 中画布的物理层中使用像转置这样的选项完成,但您的数据库可能不支持它。在这种情况下,您可以改用自定义 SQL。

例如,假设您具有下表:

若要在 Tableau 中更改其结构并优化要分析的数据,则可以使用以下自定义 SQL 查询:

SELECT Table1.Season ID AS [Season ID],
Table1.Items - Don't like AS [Quantity],
"Don't Like" AS [Reason]
FROM Table1
UNION ALL
SELECT Table1.Season ID AS [Season ID],
Table.Items - Defective AS [Quantity],
"Defective" AS [Reason]
FROM Table1
UNION ALL
SELECT Table1.Season ID AS [Season ID],
Table1.Items - Too big AS [Quantity],
"Too Big" AS [Reason]
FROM Table1
UNION ALL
SELECT Table1.Season ID AS Season ID,
Table1.Items - Too small AS [Quantity]
"Too Small" AS [Reason]
FROM Table1

查询结果在数据网格中如下所示:

有关转置选项的详细信息,请参见对数据进行转置(从列到行)

合并(联接)和聚合您的数据

如果需要合并表并聚合数据,则可以直接在 Tableau 中画布的物理层中使用联接和默认的聚合类型选项。在某些情况下,您可能需要改用自定义的 SQL。

例如,假设您具有以下两个表:订单和供应商。

订单供应商

您可以使用以下自定义 SQL 查询来查找订单数计数,并在“订单”和“供应商”表上执行左联接:

SELECT Vendors.Name,COUNT(Orders.Order) AS Number Of Orders
FROM Orders
LEFT JOIN Vendors
ON Orders.VendorID=Vendors.VendorID
GROUP BY Name;

查询的结果如下所示:

有关联接的详细信息,请参见联接数据

引用重复列时出现错误

如果自定义 SQL 查询引用重复列,则在 Tableau 中尝试使用分析的某一列时,可能会出现错误。即使查询有效,也会发生这种情况。例如,考虑以下查询:

SELECT * FROM authors, titleauthor WHERE authors.au_id = titleauthor.au_id

该查询有效,但因为在此例中 au_id 字段在“authors”表和“titleauthor”表中都存在,因此该字段不明确。Tableau 将连接到查询,但只要尝试使用 au_id 字段,就会出现错误。原因是 Tableau 不知道要引用哪个表。

注意:最佳做法是,在自定义 SQL 查询中尽可能使用 AS 子句定义列别名。这是因为,在未使用别名的情况下,每个数据库在自动生成列名称时都有自己的规则。

编辑自定义 SQL 查询

编辑自定义 SQL 查询

  1. 在“数据源”页面上的画布中,双击逻辑层中的自定义 SQL 查询。
  2. 将鼠标悬停在物理层中的自定义 SQL 表上,直到显示箭头。
  3. 单击箭头,然后选择“编辑自定义 SQL 查询”
  4. 在对话框中,编辑自定义 SQL 查询。

更改自定义 SQL 查询名称

将自定义 SQL 查询拖到画布的逻辑层时,Tableau 会为其指定一个默认名称:Custom SQL Query(自定义 SQL 查询)、Custom SQL Query1(自定义 SQL 查询 1),诸如此类。您可以将默认名称更改为更有意义的名称。

  1. 在“数据源”页面上,在画布的逻辑层中,选择自定义 SQL 查询表中的下拉箭头,然后选择“重命名”

  2. 输入要用于自定义 SQL 查询的名称。

在自定义 SQL 查询中使用参数

您可以在自定义 SQL 查询语句中使用参数以便将常量值替换为动态值。然后,可以在工作簿中更新参数以修改连接。例如,您可以连接到自定义 SQL 查询,该查询为 pageID 所指定的特定页面提供 Web 流量数据。您可以插入参数,而不是在 SQL 查询中为 pageID 值使用常量值。完成连接后,可以在工作簿中显示参数控件。使用参数控件可以除去 pageID 并拉入每个所需页面的数据,而不必编辑或复制连接。

Tableau Desktop 中,您可以直接从“自定义 SQL”对话框创建参数,也可以使用属于工作簿的任何参数。如果创建新参数,它将可供在工作簿中使用,就像任何其他参数一样。若要了解更多信息,请参见创建参数

对于 Web 制作(在 Tableau Cloud 或 Tableau Server 中),您可以使用从 Tableau Desktop 中发布的现有参数。您无法在 Web 制作过程中创建新参数。

向自定义 SQL 查询添加参数

  1. 在“数据源”页面上的画布中,将鼠标悬停在自定义表上,直至显示编辑图标,然后单击编辑按钮。
  2. 在对话框底部,单击“插入参数”
  3. 在 SQL 语句中选择常量值,然后从“插入参数”下拉菜单中选择要使用的参数。如果您尚未创建参数,请选择“创建新参数”。按创建参数中的说明创建参数。

注意: 参数只能替换文本值,不能替换表达式或标识符,例如表名称。

在以下示例中,自定义 SQL 查询会返回优先级标记为“Urgent”的所有订单。在自定义 SQL 语句中,订单优先级是常量值。如果要更改连接以查看“High”优先级订单,必须编辑数据源。

您可以将订单优先级常量值替换为参数,而不是创建并维护同一查询的许多变体。参数应包含订单优先级的所有可能值。

创建参数后,可以将其插入到 SQL 语句以替换常量值。

编辑完连接后,新参数将在“数据”窗格底部的“参数”区域中列出,并且参数控件将显示在视图右侧。当您选择不同值时,连接将进行更新。

注意: 如果您正在使用数据提取,则必须刷新数据提取才能反映对参数的更改。发布使用自定义 SQL 参数的数据源将会包括参数。系统会将参数传输至连接到该数据源的任何工作簿。

Tableau Catalog 支持自定义 SQL

Tableau Catalog 中对自定义 SQL 的支持取决于自定义 SQL 查询。

Tableau Server 和 Tableau Cloud 的 Data Management 产品中提供了 Tableau Catalog。有关 Tableau Catalog 的详细信息,请参见 Tableau ServerTableau Cloud 帮助中的“关于 Tableau Catalog”。

支持的查询

Catalog 支持符合 ANSI SQL-2003 标准的自定义 SQL 查询,但有三个已知的例外情况:

  • 时区表达式
  • 多集表达式
  • Tableau 参数

从 2021.4 开始,Tableau Catalog 还支持在自定义 SQL 中使用 Transact-SQL (T-SQL) 方言,但以下情况除外:

  • 提示
  • FOR 子句
  • OPENROWSET、OPENXML 和 OPENJSON 函数
  • ODBC 标量函数
  • FOR SYSTEM_TIME
  • TABLESAMPLE
  • MATCH 表达式
  • CONTAINS 表达式
  • FREETEXT 表达式

从 Tableau Cloud 2023 年 10 月和 Tableau Server 2023.3 开始,Tableau Catalog 还提供对使用 PostgreSQL 的自定义 SQL 查询的支持,但以下情况除外:

  • XML 函数
  • JSON 函数和运算符

支持的特性与功能

对于其连接使用 MySQL 或 PostgreSQL 驱动程序的数据源、工作簿和流程(例如,Amazon Aurora for MySQL、Amazon RedShift、Pivotal Greenplum Database、MemSQL、Denodo 及其他),Catalog 支持以下附加功能。

  • MySQL GROUP_CONCAT 函数
  • PostgreSQL 数组
  • PostgreSQL EXTRACT() 函数

其他自定义 SQL 方案和功能可能会正常工作,但 Tableau 未专门针对这些方案进行测试或提供支持。

支持的世系

当资产使用自定义 SQL 时,资产页面的“世系”选项卡上会显示一条带有“显示自定义 SQL 查询”按钮的消息。单击该按钮可查看连接中使用的自定义 SQL。然后,如果您想将自定义 SQL 复制到剪贴板,请单击“复制”

用于显示自定义 SQL 查询的按钮

某些类型的自定义 SQL 会导致上游世系不完整。发生这种情况时,会显示一条包含该信息的消息。字段详细信息卡可能不包含指向已连接列的链接,或者可能根本不显示任何连接列。列详细信息卡可能不包含指向使用该列的字段的链接,或者可能根本不显示任何字段。

如果您正在检查表的世系,请注意,Catalog 不支持在使用自定义 SQL 收集的表元数据的世系中显示列信息。但是,如果其他资产使用同一个表并且不使用自定义 SQL,则 Tableau Catalog 可能能够显示有关它通过这些其他资产发现的列的信息。

在以下屏幕截图中,由于数据源使用 factAccountOpportunityByQuarter 表,因此已建立该表的索引。但是,由于它被自定义 SQL 查询引用,因此列信息不可用。

如果有多个数据源、工作簿或流程使用表,则在应用列级别筛选器时,将排除该表中使用自定义 SQL 查询的任何下游资产。因此,世系中显示的下游资产比实际使用的资产少。

有关使用世系的详细信息,请参见 Tableau Server(链接在新窗口中打开)Tableau Cloud(链接在新窗口中打开) 帮助中的“为影响分析使用世系”。

另请参见

使用自定义 SQL 和 RAWSQL 执行高级空间分析(链接在新窗口中打开)

感谢您的反馈!您的反馈已成功提交。谢谢!