如何按组而不是数字订购列?

时间:2013-04-22 14:00:05

标签: sql db2

您好我正在使用sql db2创建age_bands:

case when age between 0 and 1 then '0-1'
when age between 2 and 3 then '2-3'
.
.
.
when age between 10 and 11 then '10-11'

当然,当您订购时,您将获得以下内容:

0-1
10-11
2-3

这不是我想要的。我如何按实际age_bands订购:

0-1
2-3
10-11

非常感谢。

3 个答案:

答案 0 :(得分:1)

就这样做

ORDER BY age

即使age_bands CASE表达式不是

,年龄仍然在提升

答案 1 :(得分:1)

如前所述,按年龄排序最简单。

但是,如果您需要分配一个乐队编号或代码,或者需要乐队中的总数或统计数据,或者乐队中的其他类别,那么您可能希望以不同的方式处理此问题。您可能希望拥有AgeBand表,定义年龄范围,可能是乐队编号或代码,可能是年龄段的名称,或其他“主”数据。

如果是这种情况,您可以使用

获取带代码
left join AgeBand ab   on details.age >= ab.FromAge and details.age <= ab.ToAge
...
order by ab.BandID, ...

但是如果您不需要AgeBand表,并且想继续使用CASE语句计算年龄段代码,那也没关系,可能就是您所需要的。

您可以做的是将当前查询放在公用表表达式或CTE中以准备数据,然后使用您指定给CTE的名称作为from-table继续SELECT语句。

WITH q AS
(SELECT ...
        CASE WHEN ...  THEN "00-01"
             WHEN ...  THEN "02-03"
             ...
             WHEN ...  THEN "10-11"
        END as bandcode
   FROM yourinputdata as i
   WHERE ...
)
SELECT bandcode, ...
  FROM q
  ORDER BY bandcode, ...
;

WITH和引号之间的查询是公用表表达式。它在第一行中给出了名称“q”,然后在底部引用。它是底部全选,控制您的最终结果。

答案 2 :(得分:0)

我认为最简单的方法是:

order by min(age)