如何使用由case语句确定的字段按特定订单排序

时间:2014-01-09 16:38:43

标签: sql-server-2005

我有以下查询(问题的简化版本)

select case when pool_type in ('WN','PL','SH','EX','QN') 
  then pool_type else 'Other' end as pooltype,
sum(wagered)
from wageringactivitytable
group by case when pool_type in ('WN','PL','SH','EX','QN') 
then pool_type else 'Other' end

我希望以特定的顺序(WN,PL,SH,EX,QN,其他)排序结果这是否可能因为我构建我的sql查询的方式?

我尝试使用另一个case语句(使用'case pool_type when'WN'时的数字,然后当'PL'然后是2等时为1)但这不起作用,因为pool_type在order by子句中无效,因为它既不包含在agregate函数中,也不包含在group by子句中....

我尝试引用列位置而不是它的名称,但在这种情况下,顺序完全被忽略..

case 1 when 'WN' then 1
when 'PL'then 2
....

when 'Other' then 6

end

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是使用如下外部查询:

SELECT *
FROM (
    select case when pool_type in ('WN','PL','SH','EX','QN') 
      then pool_type else 'Other' end as pooltype,
    sum(wagered)
    from wageringactivitytable
    group by case when pool_type in ('WN','PL','SH','EX','QN') 
    then pool_type else 'Other' end
) T
ORDER BY
  CASE WHEN pooltype = 'WN' THEN 1 
       WHEN ...
  END

另一种方法是制作帮助表......例如

pooltypeorderer
pooltype poolorder
WN       1
PL       2
etc

然后您通过pool_type和pool_order

加入该表和组

我喜欢第二个选项,因为它易于维护,您可以在不更改代码的情况下更改顺序(或添加新类型)。它确实使查询看起来更复杂(因为它有一个额外的连接)。