表格温度
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
答案 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
也存在误解 - 无法保证结果从UNION
或UNION 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