按问题分组

时间:2011-08-05 18:08:02

标签: sql-server-2008

select 
        case status
            when 'AR' then 1
            when 'AV' then 2
            when 'AN' then 3
            when 'AD' then 4
            when 'AC' then 5
            when 'AY' then 6
            when 'AH' then 7
            else 8
        end 'status_order', COUNT(*)
from dn_appeal_request
group by 
        case status
            when 'AR' then 1
            when 'AV' then 2
            when 'AN' then 3
            when 'AD' then 4
            when 'AC' then 5
            when 'AY' then 6
            when 'AH' then 7
            else 8
        end 

有没有办法在不使用select?

中使用的相同case语句的情况下进行分组

2 个答案:

答案 0 :(得分:1)

您可以通过使用子查询来避免重复您的案例陈述。您需要对值进行分组。

select D.status_order, COUNT(*)
from (
        select case status
                 when 'AR' then 1
                 when 'AV' then 2
                 when 'AN' then 3
                 when 'AD' then 4
                 when 'AC' then 5
                 when 'AY' then 6
                 when 'AH' then 7
                 else 8
               end 'status_order'
        from dn_appeal_request
     ) as D
group by D.status_order

答案 1 :(得分:0)

不,在上面的示例中,没有办法避免GROUP BY子句中的CASE。

如果你绝对不想重复自己,你可以做的解决方法是创建派生表:

 SELECT CASE [Status]   when 'AR' then 1            
        when 'AV' then 2            
        when 'AN' then 3            
        when 'AD' then 4            
        when 'AC' then 5            
        when 'AY' then 6            
        when 'AH' then 7            
        else 8        
        END AS status_order
        ,Total
 FROM (
     SELECT [Status], COUNT(*) AS Total
     FROM dn_appeal_request
     GROUP BY  [Status]
 ) AS Foo