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

當您需要保留順序時,此技巧對於漏斗圖特別有用。