Как написать это предложение SQL Order By

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