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 附带的示例数据库的示例,您可以自己尝试一下。假设我们想查看每个产品类别的订单数量,但我们需要像这样对它们进行排序:小部件、小玩意、装置、小玩意。以下是带有 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

当您需要保留顺序时,此技巧对于 漏斗图 特别有用。