2013-06-24 29 views
0

我试图返回状态列表中的“最大”值。但是,我想为字符串值指定一个排序值,以便通过我自己的排名返回最大值,而不是按字母顺序排列。SQL使用查找来返回组中的最大值?

这里是我的代码:

select x.wbs1, x.wbs2, x.wbs3, x.custstatus 
    from (
      select wbs1,wbs2,wbs3,custstatus=MAX(custstatus) 
      from Projects_CRStatus 
      where custsentdate >= 'June 1, 2001' AND custsentdate <= 'June 30, 2013' 
      AND CustStatus IN ('RECEIVED AT VENDOR', 'CONFIRMATION SENT', 
      'IC PENDING','CONFIRMATION RECEIVED','CANCELLED') 
      group by wbs1,wbs2,wbs3) x 
    inner join (
      select wbs1,wbs2,wbs3,custsentdate=max(custsentdate) 
      from Projects_CRStatus 
      group by wbs1,wbs2,wbs3) y 
    on (x.wbs1=y.wbs1 and x.wbs2=y.wbs2 and x.wbs3=y.wbs3) 

    ORDER BY CustEnrollmentID 

我想要做的是排名CustStatus的值,这样,而不是返回CustStatus的顶部按字母顺序排列的结果,我得到了这个秩序的最先进的地位。

  1. '接收的供应商'
  2. '确认书SENT'
  3. 'IC PENDING'
  4. 'CONFIRMATION RECEIVED'
  5. '已取消'
+0

为了澄清,我正在寻找在x中的每个wbs1,wbs2,wbs3分组内的排名最高的状态。 –

回答

1

您使用Word 排名,但我猜你真的在问如何订单您的查询resul吨。如果是这样,你可以在ORDER BY子句中使用CASE表达:

ORDER BY CASE WHEN CustStatus = 'RECEIVED AT VENDOR' then 1 
       WHEN CustStatus = 'CONFIRMATION SENT' then 2 
       WHEN CustStatus = 'IC PENDING' then 3 
       WHEN CustStatus = 'CONFIRMATION RECEIVED' then 4 
       WHEN CustStatus = 'CANCELLED' then 5 
       ELSE 6 
     END, CustEnrollmentID 

CASE表达式(在ELSE条件)的最后一项仅仅是为了安全着想。

更新:根据您的后续意见,这里是一个查询返回的“巅峰状态”使用ROW_NUMBER函数:

select wbs1, wbs2, wbs3, custstatus 

from (
    select x.wbs1, x.wbs2, x.wbs3, x.custstatus, 
     ROW_NUMBER() OVER(PARTITION BY x.wbs1, x.wbs2, x.wbs3 
         ORDER BY CASE 
         WHEN x.CustStatus = 'RECEIVED AT VENDOR' then 1 
         WHEN x.CustStatus = 'CONFIRMATION SENT' then 2 
         WHEN x.CustStatus = 'IC PENDING' then 3 
         WHEN x.CustStatus = 'CONFIRMATION RECEIVED' then 4 
         WHEN x.CustStatus = 'CANCELLED' then 5 
         ELSE 6 END) as rn 
    from (
     select wbs1,wbs2,wbs3,custstatus=MAX(custstatus) 
     from Projects_CRStatus 
     where custsentdate >= 'June 1, 2001' 
     AND custsentdate <= 'June 30, 2013' 
     AND CustStatus IN ('RECEIVED AT VENDOR', 'CONFIRMATION SENT' 
      ,'IC PENDING','CONFIRMATION RECEIVED','CANCELLED') 
     group by wbs1,wbs2,wbs3) x 
    inner join (
     select wbs1,wbs2,wbs3,custsentdate=max(custsentdate) 
     from Projects_CRStatus 
     group by wbs1,wbs2,wbs3) y 
    on (x.wbs1=y.wbs1 and x.wbs2=y.wbs2 and x.wbs3=y.wbs3) 
    ) z 

WHERE RN = 1 
+0

我正在寻找“group by”中的Top状态结果。所以,我正在寻找每个wbs1,wbs2,wbs3组合的排名最高的状态。 –

+0

@GabeN。哦。你使用什么风格的SQL?你熟悉'ROW_NUMBER'窗口函数吗?如果你的数据库支持它,那将是一条路。 – BellevueBob

+0

我正在使用SQL Server。我使用了ROW_NUMBER/Partition OVER方法,但获得了多个结果。 –

0

最好有一个表,这个状态码数据,并加入该表,所以将可以通过此状态表列进行排序。