每个行操作的case语句

时间:2018-04-04 17:00:17

标签: sql sql-server case

嗨我有一张有ID和状态的表。一个ID可以有多个状态,但我必须根据条件选择状态。

如果ID 1已批准,则稍后,已修改我应选择已批准,如果ID仅批准,则仅选择已批准。但我得到的案例陈述不是按ID进行。它正在根据状态更改整体数据。请指教

  select ID,
CASE
    WHEN status = 'Approved'
    AND status IN(
        'Modified',
        'Later'
    ) THEN 'Partial Modified'
    WHEN status = 'Approved' THEN 'Approved'
    when status IN('Modified','Edited') THEN 'Modified'
    else status
END status group by ID,Status

2 个答案:

答案 0 :(得分:0)

这可以通过row_number中的订购条件来完成。

select top 1 with ties *
from tbl 
order by row_number() over(partition by id order by case when status='Approved' then 1 
                                                         when status='Modified' then 2
                                                    else 3 end)

答案 1 :(得分:0)

我认为你想要一个聚合,所以像这样:

(CASE WHEN SUM(CASE WHEN status = 'Approved' THEN 1 ELSE 0 END) > 0
      THEN 'Approved'
      WHEN SUM(CASE WHEN status = 'Modified' THEN 1 ELSE 0 END) > 0
      THEN 'Modified'
      ELSE MAX(status)
 END)

当然,您也可以使用窗口函数执行此操作:

(CASE WHEN SUM(CASE WHEN status = 'Approved' THEN 1 ELSE 0 END) OVER (PARTITION BY id) > 0
      THEN 'Approved'
      WHEN SUM(CASE WHEN status = 'Modified' THEN 1 ELSE 0 END) OVER (PARTITION BY id) > 0
      THEN 'Modified'
      ELSE MAX(status) OVER (PARTITION BY id)
 END)