SQL查询:在UNION中排序

时间:2011-08-10 10:15:15

标签: sql sql-order-by union

我在使用UNION查询的SQL Server 2005(Express版)时遇到了一些问题。

我有这个表订单包含以下列:OrdNr,Prio 现在我想以2种方式通过订单订购,第一种方式是紧急订单(所以prio 6或16),第二种方式,其余订单按Prio排序。

所以这就是我的表格:

ORDNR  PRIO
1       6
2       16
3       2
4       8

我想要的是:

ORDNR  PRIO
2       16
1       6
4       8
3       2

我的查询尝试是:

SELECT OrdNbr, Prio 
FROM Orders
WHERE Prio IN (6,16) 
ORDER BY Prio DESC
UNION
SELECT OrdNbr, Prio 
FROM Orders
WHERE Prio NOT IN (6,16) 
ORDER BY Prio DESC

但我从SQL收到错误:UNION附近的语法错误

请帮助:D

5 个答案:

答案 0 :(得分:6)

SELECT OrdNbr, Prio 
  FROM Orders
ORDER BY
  CASE Prio 
    WHEN 16 THEN 0 
    WHEN 6 THEN 1
    ELSE 2 END,  
  Prio DESC

答案 1 :(得分:2)

我认为你需要这个


SELECT OrdNbr, Prio 
FROM Orders
WHERE Prio IN (6,16) 
UNION
SELECT OrdNbr, Prio 
FROM Orders
WHERE Prio NOT IN (6,16) 
ORDER BY Prio DESC

==编辑== 如果您的Prio字段是整数,我认为以下将起作用


select * from (
SELECT OrdNbr,Prio 
FROM Orders
WHERE Prio IN (6,16) 
UNION
SELECT OrdNbr, Prio 
FROM Orders
WHERE Prio NOT IN (6,16) 
)
ORDER BY Prio DESC

答案 2 :(得分:1)

最简单的方法(如果你不介意添加另一个输出列)是:

SELECT OrdNbr, Prio, 1 AS Seq
FROM Orders
WHERE Prio IN (6,16) 
UNION
SELECT OrdNbr, Prio, 2 AS Seq
FROM Orders
WHERE Prio NOT IN (6,16) 
ORDER BY Seq, Prio DESC;

答案 3 :(得分:0)

试试这个:

SELECT OrdNbr, Prio
FROM
(
    SELECT OrdNbr, Prio,
     CASE WHEN Prio IN (6,16) THEN 0 ELSE 1 END ord
    FROM Orders
) t
ORDER BY ord, Prio;

答案 4 :(得分:0)

SELECT ordnbr,        PRIO,
       CASE prio
         当16那么1          当6那么2
         ELSE 3
       结束为NewPriority
来自订单
按新优先顺序排序,           prio DESC

根据要求,16和6得到前2个优先级,其余订单应根据Prio排序

只有你会看到一个额外的列(NewPriority),它可以在你的应用程序中显示时被屏蔽。

另外一个提示是,如果基于此构建应用程序,Ordernumber(OrdNbr)应该是唯一的。