0

嗨,我正在使用 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

?

非常感谢。

4

3 回答 3

1

就这样做

ORDER BY age

年龄当然还在上升,即使age_bandsCASE 表达式不是

于 2013-04-22T14:06:42.213 回答
1

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

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

如果是这种情况,你会得到你的乐队代码

left join AgeBand ab   on details.age >= ab.FromAge and details.age <= ab.ToAge
...
order by ab.BandID, ...

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

您可以做的是将当前查询放入公共表表达式或 CTE 中以准备数据,然后使用您分配给 CTE 的名称作为源表继续执行 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”,然后在底部被引用。控制最终结果的是底部全选。

于 2013-04-22T15:58:01.990 回答
0

我认为最简单的方法是:

order by min(age)
于 2013-04-22T14:00:46.067 回答