如何在四列中对表中的数据进行排序?

时间:2015-04-17 14:48:24

标签: sql db2

我在db2中有一个表要排序。该表有四列。 数据如下:

KEY Type    GROUP_ID    SpecialType
2   T02     700         S
2   T01     500         R
1   T02     300         B
2   T02     600         S
1   T02     400         S
2   T02     700         B
1   T01     400         R
1   T02     300         S
2   T02     600         B

排序顺序具有以下规则:

  • 第一个排序键是KEY
  • 特殊类型R应始终位于每个密钥组中。
  • S可能位于R和B元素之后,但它应该具有相同的group_id
  • 如果S与R specialpe具有相同的group_id,则应该遵循此R Specialtype

结果应该以这种形式显示

KEY Type    GROUP_ID    SpecialType
1   T01     400         R
1   T02     400         S
1   T02     300         B
1   T02     300         S
2   T01     500         R
2   T02     600         B
2   T02     600         S
2   T02     700         B
2   T02     700         S

我试过这个ORDER BY,但它不起作用:

select * from myTable
ORDER BY KEY, GROUP_ID, CASE WHEN SPECIALTYPE = 'R' THEN 1
                             WHEN SPECIALTYPE='B' THEN 2
                             ELSE 3 END

任何想法?

3 个答案:

答案 0 :(得分:2)

这应该按照您提供的顺序返回列表。它包括一个分析函数,它计算次数' R' R'包含在每个GroupId中,以便首先列出这些groupId。

SELECT
    t.KeyId,
    t.TypeName,
    t.GroupId,
    t.SpecialType
FROM @Table t
ORDER BY 
    KeyId,
    CASE WHEN SpecialType = 'R' THEN 1 ELSE 2 END,
    COUNT(CASE WHEN t.SpecialType = 'R' THEN SpecialType END) OVER (PARTITION BY t.GroupId) DESC,
    GroupId,
    SpecialType

答案 1 :(得分:1)

你几乎就在那里。

尝试select * from myTable ORDER BY KEY, CASE WHEN SPECIALTYPE = 'R' THEN 1 ELSE 2 END, GROUP_ID

答案 2 :(得分:1)

您需要创建表来定义排序首选项,如此

Preferance
---------------------------------------------
SpecialType         OrderNo
---------------------------------------------
R                  1
B                  2
S                  3

现在将此表与您的主表连接并从此表中选择订单列,并使用orderNo列对您的记录进行排序

select T.*, P.orderNo  
from myTable  T
  INNER JOIN Preferance P ON T.Preferance = P.Preferance
ORDER BY T.KEY, T.GROUP_ID, P.orderNo 
相关问题