使用SQL问题为仪表板添加过滤器

如何在仪表板上添加筛选小部件并将其连接到SQL问题中的字段筛选变量。

本文介绍了如何创建仪表板小部件以在原生查询中筛选数据。在仪表板筛选器中选择一个值将更新SQL问题中的结果。

A dashboard with a SQL question wired up to a filter.

这里的目的是理解如何将仪表板筛选小部件连接到一种特殊变量类型,称为字段筛选器,我们将它插入到我们的问题的SQL代码中。

我们将介绍两个示例:一个日期筛选器(接下来),一个带有下拉列表的文本筛选器

将字段筛选变量添加到SQL问题

让我们从一个用SQL编写的查询开始,该查询显示Metabase附带样本数据库的每月订单。从任何Metabase页面,在导航栏的右上角点击+ 新建并选择SQL查询(或原生查询)。

A question written in SQL showing orders per month, visualized as a line chart.

这是SQL代码

SELECT DATE_TRUNC('Month', CREATED_AT) AS "Created",
       COUNT(*) AS "Number of orders"
FROM orders
GROUP BY "Created"
ORDER BY "Created" ASC

现在,我们正在谈论数据筛选,细心的读者可能已经意识到我们的SQL代码中没有筛选语句。没有WHERE子句。这意味着:即使我们将此问题添加到仪表板并添加筛选小部件,该筛选器对我们的SQL问题也没有影响,因为没有为我们的小部件插入值的指定位置。

让我们通过添加一个称为字段筛选器的特殊变量来解决这个问题。字段筛选器是一种特殊类型的变量,它将变量映射到表中的字段(或列)。

这是我们将在SQL中添加的代码


WHERE {{created_at}}

您可能会注意到WHERE子句中缺少一个=运算符。这种缩写语法存在,因为字段筛选器在幕后处理一些SQL代码。有关更多信息,请参阅字段筛选器

有了WHERE子句,我们的代码看起来是这样的


SELECT DATE_TRUNC('Month', CREATED_AT) AS "Created",
       COUNT(*) AS "Number of orders"
FROM orders
WHERE {{created_at}}
GROUP BY "Created"
ORDER BY "Created" ASC

现在我们的变量已经在SQL代码中了,我们需要告诉Metabase如何使用这个变量。当我们向代码中添加一个变量时,Metabase会展开变量侧边栏。我们将变量类型设置为字段过滤器,然后将该变量映射到数据库中的一个字段,这样Metabase就可以知道应该添加哪种过滤器小部件。在这种情况下,我们将变量映射到orders表的created_at字段。

Setting the variable type for our SQL variable created_at to Field Filter, then setting the Field to map to option to the created_at field (column) of the orders table.

请注意,我们可以将SQL变量命名为任何我们想要的名字,但为了仪表板过滤器能够工作,我们必须将该变量映射到适当的字段。

目前,我们将过滤器小部件标签保留为创建时间,并且不更改是否必需?切换。如果变量的过滤器小部件没有值,Metabase将像WHERE子句不存在一样运行问题。

我们还可以选择过滤器小部件类型,尽管这种小部件只会应用于我们的问题。让我们选择日期过滤器类型。

让我们保存我们的问题。我们将它命名为每月订单数量 - SQL

在我们将问题添加到仪表板之前,让我们先绕道一下。

数据类型绕道

当我们选择created_at字段时,Metabase知道该字段类型是创建时间戳(注意日历图标)。您可以通过浏览数据来了解每个表拥有的字段(列)的类型。

View information about your data by clicking on Browse Data from the top navigation bar, selecting your database---in this case, Sample Database---clicking on the information icon next to a table, and clicking on the book icon to learn about this table.

Viewing information on the fields in the Orders table of the Sample Database.

管理员可以在管理面板数据模型选项卡中编辑字段类型以及其他元数据设置。要了解更多信息,请参阅我们的元数据编辑文档

将仪表板过滤器小部件连接到字段过滤器变量

因此,我们有一个带有字段过滤器变量的SQL问题,它在WHERE子句中,现在是将该问题添加到仪表板中的时候了。

接下来,我们需要

  • 创建一个仪表板。
  • 将我们的问题添加到仪表板中。
  • 向仪表板中添加一个过滤器小部件。
  • 将仪表板过滤器小部件连接到我们的SQL问题中的字段过滤器变量。

让我们创建一个仪表板(我们将仪表板命名为具有过滤器小部件的仪表板)。

然后我们将将我们的SQL问题添加到仪表板中。

接下来,我们将向仪表板添加一个过滤器小部件。单击铅笔图标进入仪表板编辑模式,然后

  • 单击过滤器图标向仪表板添加一个过滤器小部件。
  • 我们想要过滤什么下,我们将选择时间
  • 对于过滤器类型,我们将选择日期过滤器
  • 接下来,我们需要将我们的小部件连接到问题中的字段过滤器变量。单击问题中间的下拉菜单,并选择我们的创建时间字段过滤器变量。
  • 单击屏幕顶部的完成按钮。
  • 然后保存仪表板。

Adding a Date filter (Time → All options) to a dashboard, and connecting the filter widget to the Field Filter variable, Created at in our SQL question.

现在我们已全部连接好,准备测试我们的新日期过滤器。这个特定的小部件类型给我们提供了丰富的选项。让我们看一下过去六个月的订单。

Using a dashboard filter to filter orders for the last six months.

将 SQL 问题连接到仪表板上的下拉过滤器小部件

假设我们想要在仪表板上有一个过滤器小部件来按类别筛选产品,并希望人们能够从下拉列表中选择可用的类别。为了设置这个,我们将在 SQL 查询中放置一个字段过滤器变量,并将其映射到 products 表中的 category 字段。然后我们将仪表板过滤器映射到该变量。让我们一步一步来做。

A dashboard with a dropdown filter connected to a SQL question card.

首先,创建一个仪表板。让我们称它为“包含 SQL 问题和使用下拉过滤器的仪表板”(这样我们的任务就很明确了)。保存仪表板。

接下来,提出一个新的本地/SQL 问题,以获取 products 表中的所有字段。为了按类别筛选产品,我们将包括一个称为 category 的变量


SELECT
  *
FROM
  products
WHERE {{category}}

在 Metabase 弹出的变量侧边栏中,我们将这样配置这个变量

  • 变量类型:字段过滤器。
  • 要映射的字段:产品表中的类别字段。
  • 过滤器小部件类型:字符串。
  • 过滤器小部件标签:类别(或您想要的内容)。
  • 用户如何通过此变量筛选:下拉列表。
  • 必需:否。
  • 默认过滤器值:留空(这样默认情况下不会筛选产品类别)。

Creating a SQL question that includes a field filter mapped to the products.category field. The field filter variable is then connected to a filter widget that

保存问题并将其添加到您的仪表板中。编辑仪表板,并添加文本或类别过滤器。

Adding a text or category filter widget to a dashboard.

选择 ,这样人们就可以从列表或搜索框中选择一个或多个值。

Setting up a dropdown dashboard filter connected to a field filter variable in a SQL question.

将仪表板过滤器小部件映射到问题卡片上的类别变量。确保将 人们如何通过此列筛选 选项设置为“下拉列表”。

在侧边栏底部单击 完成,然后保存您的仪表板。您应该可以继续了。

进一步阅读

下一步:SQL 小技巧:在图表中对条形进行排序

保留您希望条形在图表中出现的顺序的简单技巧。

下一篇文章