SQL查询:按联合排序

SQL查询:按联合排序,sql,sql-order-by,union,Sql,Sql Order By,Union,我对带有联合查询的SQLServer2005Express版有点问题 我有以下列的表格订单:OrdNr、Prio 现在我想用两种方式按订单排序,第一种方式是6号或16号之前的紧急订单,第二种方式,其余的订单按6号或16号之前的订单排序 这就是我的桌子的样子: ORDNR PRIO 1 6 2 16 3 2 4 8 我想要的是: ORDNR PRIO 2 16 1 6 4 8 3 2 我的查询尝

我对带有联合查询的SQLServer2005Express版有点问题

我有以下列的表格订单:OrdNr、Prio 现在我想用两种方式按订单排序,第一种方式是6号或16号之前的紧急订单,第二种方式,其余的订单按6号或16号之前的订单排序

这就是我的桌子的样子:

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的语法错误

请帮忙:我想你需要这个


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


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

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;
试试这个:

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;
选择ordnbr, 普里奥, 案例优先 16岁时1岁 当6岁时,2岁 其他3 以新的优先级结束 从命令 按新优先级排序, 优先描述

根据给定的要求,16和6获得前2个优先级,其余订单应根据优先级排序

唯一的问题是,您将看到一个额外的列NewPriority,它可以在应用程序中显示时被屏蔽


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

这不会使Prio 6和16排在其他Prio之前。这不会给出正确的顺序,因为Prio 8将排在6之前。在这种情况下,您可以使用DISTINCT吗?当我尝试在您的解决方案中使用DISTINCT时,我遇到了以下错误:如果选择DISTINCT,则ORDER BY items必须出现在选择列表中specified@darkownage-你为什么需要区分?订单表中有重复的OrdNbr吗?@Mikael Eriksson-是的,我们有重复的OrdNbr。@darkownage我认为在这种情况下,您必须将案例移动到字段列表中,即选择不同的OrdNbr、Prio、CASE Prio。。。按等级ASC,Prio排序,以等级结束DESC@darkownage-您可以在子查询中执行distinct。选择OrdNbr,Prio FROM选择不同的OrdNbr,Prio FROM Orders作为O顺序按情况Prio 16时,然后0时,6时,然后1其他2结束,Prio DESC
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;