SQL Server组按状态查询问题

时间:2011-07-15 06:03:23

标签: sql-server

表格温度

ID  Status
1   completed
2   approved
3   paid
4   cancel
5   approved
6   paid

我想在不使用union的情况下显示以下表格,因为这是客户要求,所以请为此提供帮助。

表格温度

ID  Status
1   completed
2   approved
5   approved
3   paid
6   paid
4   cancel

3 个答案:

答案 0 :(得分:1)

由于您尝试任意排序行,因此可以在CASE子句中使用ORDER BY语句。这是一个工作示例,它将为您提供您正在寻找的输出(对于SQL Server):

DECLARE @myTable AS TABLE([ID] INT, [Status] VARCHAR(16))
INSERT INTO @myTable VALUES(1, 'completed')
INSERT INTO @myTable VALUES(2, 'approved')
INSERT INTO @myTable VALUES(3, 'paid')
INSERT INTO @myTable VALUES(4, 'cancel')
INSERT INTO @myTable VALUES(5, 'approved')
INSERT INTO @myTable VALUES(6, 'paid')

SELECT * 
FROM @myTable
ORDER BY
    CASE [ID]
        WHEN 1 THEN 1
        WHEN 2 THEN 2
        WHEN 3 THEN 4
        WHEN 4 THEN 5
        WHEN 5 THEN 3
        WHEN 6 THEN 6
        ELSE 999
    END

答案 1 :(得分:1)

几乎与Dan的答案相同,但对于SQL Server(或任何标准SQL数据库系统):

SELECT 
  ID, 
  Status 
FROM 
  temp 
ORDER BY 
  CASE Status
      WHEN 'completed' THEN 1
      WHEN 'approved' THEN 2
      WHEN 'paid' THEN 3
      WHEN 'cancel' THEN 4
  END

其他问题 -

1)这个问题的标题似乎具有误导性,因为它根本不是关于GROUP BY的,而且,

2)我认为您对UNION也存在误解 - 无法保证结果从UNIONUNION ALL返回的顺序 - 在{{1}中} case,可能是一个帮助服务器消除重复的排序操作,但是执行哪种排序完全取决于服务器,你不应该依赖这样的排序总是必要的。对于UNION,假设第一个查询是大型查询,需要大量I / O,第二个查询是微不足道的(例如,所需的所有数据都已在内存中)。服务器的一个明显优化是返回第二个查询的结果,同时它仍在执行第一个查询的I / O.

答案 2 :(得分:0)

select ID,
       [Status]
from Temp
order by case [Status]
           when 'completed' then 1
           when 'approved'  then 2
           when 'paid'      then 3
           when 'cancel'    then 4
           else 5
         end, ID