SQL-запрос: упорядочить в UNION - PullRequest
4 голосов
/ 10 августа 2011

У меня небольшая проблема с SQL Server 2005 (Express edition) с запросом UNION.

У меня есть эта таблица Orders со следующими столбцами: OrdNr, Prio Теперь я хочу сделать заказ по заказамв двух отношениях первый способ - это срочные ордера (например, 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

Пожалуйста, помогите: D

Ответы [ 5 ]

6 голосов
/ 10 августа 2011
SELECT OrdNbr, Prio 
  FROM Orders
ORDER BY
  CASE Prio 
    WHEN 16 THEN 0 
    WHEN 6 THEN 1
    ELSE 2 END,  
  Prio DESC
2 голосов
/ 10 августа 2011

Я думаю, вам нужно это


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

1 голос
/ 10 августа 2011

Самый простой способ (если вы не возражаете добавить еще один выходной столбец):

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;
0 голосов
/ 07 февраля 2013

ВЫБРАТЬ ordnbr, ПРИО,
СЛУЧАЙ ПРИО
КОГДА 16 ТО 1
КОГДА 6 ТО 2
ELSE 3
END AS NewPriority
ОТ заказов
ЗАКАЗАТЬ ПО ПРИОРИТЕТУ prio DESC

В соответствии с данным требованием 16 и 6 получают первые 2 приоритета, а оставшиеся ордера должны быть отсортированы на основе Prio

Единственное, вы увидите дополнительный столбец (NewPriority), который можно скрыть при отображении в приложении.

Плюс здесь совет: если приложение строится на основе этого, Ordernumber (OrdNbr) должен быть уникальным.

0 голосов
/ 11 августа 2011

Попробуйте это:

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;
...