连接到自定义 SQL 查询

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

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

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

重要信息:从 Tableau 2019.1 开始,您不再能够创建新的旧版 Excel 或文本连接。使用这些旧版连接创建的现有工作簿将继续工作,直至 2019.4 为止,届时将会移除对旧版连接的所有支持。请参见 Tableau 社区中的 Legacy Connection Alternatives(旧版连接替代方案)文档,了解使用旧版连接的替代方案。

连接到自定义 SQL 查询

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

  2. 在文本框中键入或粘贴查询。

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

建立完数据连接后,只有自定义 SQL 查询的相关字段才会显示在“数据源”页面的数据网格中。

自定义 SQL 查询的示例

垂直合并表(合并)

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

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

November December

您可以使用以下自定义 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 查询。

更改自定义 SQL 查询名称

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

  1. 在数据源页面上的画布中,双击默认查询名称,例如,Custom SQL Query(自定义 SQL 查询)

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

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

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

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

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

向自定义 SQL 查询添加参数

  1. 在“数据源”页面上的画布中,将鼠标悬停在自定义表上,直至显示编辑图标,然后单击编辑按钮。

  2. 在对话框底部,单击“插入参数”

  3. 在 SQL 语句中选择常量值,然后从“插入参数”下拉菜单中选择要使用的参数。如果您尚未创建参数,请选择“创建新参数”。按创建参数中的说明创建参数。

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

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

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

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

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

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

另请参见

使用自定义 SQL 和 RAWSQL 执行高级空间分析

感谢您提供反馈! 提交反馈时出错。请重试或向我们发送消息