#sql #stored-procedures
#sql #хранимые процедуры
Вопрос:
У меня есть SQL-запрос, который я пытаюсь написать, и теперь я немного застрял в том, как написать предложение order by.
В основном таблица, из которой я выбираю, содержит элементы со значением серьезности. Я хочу выбрать эти элементы и упорядочить их так, чтобы столбец серьезности упорядочивался по степени серьезности 1-4, затем 0, а дата журнала убывала для каждого.
Серьезность 1 — самая высокая, 4 — самая низкая, а 0 соответствует неназначенной серьезности, мне нужно отобразить эти элементы с наивысшей серьезностью, сначала самый старый элемент, самый низкий уровень серьезности, последний самый новый элемент.
Мой запрос до сих пор:
SELECT
[TicketID],
[type],
[Product],
[Description],
[LoggedBy],
[LogDate],
[Department],
[AssignedTo],
[Severity],
[Status],
[LastUpdatedBy],
[LastUpdatedDate]
FROM
SupportTicketsTbl
WHERE
TicketID NOT IN
(
SELECT
tck.ticketID
FROM
SupportTicketsTbl tck
JOIN
tblTicketsInEvents tie
ON
tck.TicketID = tie.ticketID
JOIN
tblSupportEvent ev
ON
tie.eventID = ev.id
where
ev.type = 1
)
AND
Status <> 'Complete'
Я думаю, самый простой способ — создать табличную переменную и выбрать в ней все элементы, которые не равны 0, в нужном мне порядке, затем выбрать все элементы 0 в моей табличной переменной и, наконец, просто выбрать все обратно из табличной переменной, но это кажется немного запутанным, поэтому мне интересноесли есть более элегантное решение?
Спасибо
Ответ №1:
Поскольку вам не понравился ответ UNION, и я не уверен, что UNION гарантированно сохранит порядок…
ORDER BY CASE WHEN severity = 0 THEN 999 ELSE Severity END, date
Ответ №2:
Вы можете заказать с помощью оператора case, подобного этому:
ORDER BY CASE Severity WHEN 0 THEN 1 ELSE 2 END, Severity
Ответ №3:
Сначала выберите все с уровнями серьезности 1-4, используя стандартное предложение orderby, затем объедините результаты со вторым запросом, который выбирает только те, которые имеют уровень серьезности 0.
Комментарии:
1. Спасибо, это то, что я думал, что я должен сделать, я просто надеялся, что будет способ сделать это в одном ПОРЯДКЕ с помощью etc вместо того, чтобы использовать UNION
2. Это не сработает. порядок по упорядочит весь результат.
3. ORDER BY должен быть в круглых скобках с отдельными запросами ОБЪЕДИНЕНИЯ, и это обычно будет работать. (Не уверен, что всегда будет работать, хотя …)
Ответ №4:
Если я не очень сильно ошибаюсь, это что-то вроде этого:
ORDER BY severity DESC, date DESC
Вставьте эту строку в свой SQL.
Сначала данные будут отсортированы по степени серьезности, и если они имеют одинаковую степень серьезности, затем отсортируйте их по дате.
Комментарии:
1. Это сработало бы зимой, но у меня должно быть 0 после 4, поэтому он упорядочен по степени серьезности 1,2,3,4,0.