3级嵌套排序

时间:2017-03-10 20:22:21

标签: sql postgresql sorting select sql-order-by

我正在尝试实现3级嵌套排序。基本上我有四列:

 A   |  B  |  C  |  D
 --- | --- | --- | ---
 bob | GOOD|  1  |
 kat | BAD |     | 24
 bob | OK  |     | 15
 bob | GOOD|  20 |
 bob | OK  |     | 10
 bob | OK  |  5  | 

我需要三个级别的排序...第一级列A ASC,第二级是B列的案例排序,第三级我需要根据C& C的值排序D如果B ='GOOD'并且基于C排序,如果B是任何其他值。

我目前拥有的是:

ORDER
    BY A,
    CASE
        WHEN B ='GOOD' THEN 1 
        WHEN B = 'OK' THEN 2 
        WHEN B = 'BAD' THEN 3
    END, C

然而,这仅根据C的值对第三级进行排序。

2 个答案:

答案 0 :(得分:2)

您可以使用另一个案例陈述:

ORDER BY A,
         CASE B WHEN 'GOOD' THEN 1 
                WHEN 'OK' THEN 2 
                WHEN 'BAD' THEN 3
         END,
         CASE B WHEN 'GOOD' THEN C ELSE D END

在示例数据中,没有任何行似乎都有C和D的值。如果确实如此,您可以使用coalesce简化:

ORDER BY A,
         CASE B WHEN 'GOOD' THEN 1 
                WHEN 'OK' THEN 2 
                WHEN 'BAD' THEN 3
         END,
         COALESCE(C, D)

答案 1 :(得分:0)

如果我做对了

ORDER BY A,
    CASE
        WHEN B ='GOOD' THEN 1 
        WHEN B = 'OK' THEN 2 
        WHEN B = 'BAD' THEN 3
    END, C,
    CASE WHEN B ='GOOD' THEN D END