SQL查询:按联合排序
我对带有联合查询的SQLServer2005Express版有点问题 我有以下列的表格订单:OrdNr、Prio 现在我想用两种方式按订单排序,第一种方式是6号或16号之前的紧急订单,第二种方式,其余的订单按6号或16号之前的订单排序 这就是我的桌子的样子: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 我的查询尝
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;