我有一个"Order"Table which houses "Status"Column. Values under Status = ('Completed','Sold','In-Process','Released','NotStarted')
。
即使表中没有序列或层次结构,我们也可以看到如下序列。
1 NotStarted
2 Released
3 In-Process
4 Sold
5 Completed
因此,“已完成”是最高状态,每个订单都要经过这些状态,直到完成为止。如果尚未完成,则应处于其他状态之一。
当我选择“已完成”时,我会错过其他记录。当我包含所有状态时,我会获得多个相同订单的记录,例如1个记录为Released,1个记录为InProcess,等等(即订单的各个阶段)
select * from OrderTable
where Status = 'Completed'
我想有能力做这样的事情-
COALESCE(Completed,Sold,In-Process,Released,NotStarted, NULL)
换句话说,我想获得该状态的最高记录,而每个订单仅获得1条记录。
在Sql中有可能吗?
答案 0 :(得分:6)
一种选择是将ROW_NUMBER()
与Case表达式一起使用来建立订单。
SELECT *
FROM
(
SELECT OrderNumber,
Status,
ROW_NUMBER() OVER (PARTITION BY OrderNumber ORDER BY
CASE Status
WHEN 'NotStarted' THEN 1
WHEN 'Released' THEN 2
WHEN 'In-Process' THEN 3
WHEN 'Sold' THEN 4
WHEN 'Completed' THEN 5
END DESC) as Order_Status_Rank
FROM OrderTable
) dt
WHERE Order_Status_Rank = 1;
答案 1 :(得分:0)
如果使用列表中显示的数字而不是文本,则只需选择“前1”并按数字排序。您可以使用另一个表来存储号码/输入数据。顺便说一下,这还可以防止错误的数据输入。