SQL技巧:图表中条形的排序

一个简单的技巧,用于保留图表中条形图中想要显示的顺序。

这里的问题是:你正在编写一个查询,你希望保持结果在条形图或漏斗图上排序,但查询返回的值搞乱了排序。

例如,假设你想按某种不太容易排序的东西进行排序,比如如果你有四个不同的步骤分别标记为“第一”、“第二”、“第三”、“第四”,并希望按语义顺序对它们进行排序,而不考虑它们相应的值。Metabase(或你正在使用的任何工具)会将这些值作为字符串排序(即,它们将按字母顺序排序,而不是按语义排序,这没有太多意义:“第一”、“第四”、“第二”、“第三”)。

这是一个技巧,用于重新排列图表以指定所需的顺序。

  1. 按照你通常的方式编写查询(当然,遵循最佳实践)。
  2. 假设你想要按名为step的列中的值进行排序,在查询末尾,使用一个CASE表达式来定义step列中值的顺序。
ORDER BY
    CASE
        WHEN step = 'First' THEN 1
        WHEN step = 'Second' THEN 2
        WHEN step = 'Third' THEN 3
        WHEN step = 'Fourth' THEN  4
    END

使用CASE表达式进行排序的示例

Using a CASE expression to enforce the order of bars on a chart.

这是一个示例,使用Metabase附带的自样数据库,你可以亲自尝试。假设我们想查看按产品类别划分的订单数量,但我们需要按以下方式排序:Widget、Gizmo、Gadget、Doohickey。以下是带有CASE语句的代码

-- We want to return two columns, ordered by products.category
SELECT products.category,
       Count(*)
FROM   orders
       LEFT JOIN products
              ON orders.product_id = products.id
GROUP  BY products.category
-- The CASE statement will assign a new value to sort by
ORDER  BY CASE
            WHEN products.category = 'Widget' THEN 1
            WHEN products.category = 'Gizmo' THEN 2
            WHEN products.category = 'Gadget' THEN 3
            WHEN products.category = 'Doohickey' THEN 4
          END

这个技巧在需要保留序列的漏斗图中特别有用。