ORDER BY не работает при использовании CASE WHEN, но работает без него? - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть следующее предложение выбора, в котором я пытаюсь упорядочить свои результаты определенным образом, особенно в иерархии отдела.Однако, когда я добавляю случаи, мой ORDER BY перестает работать и выдает ошибку:

Элементы ORDER BY должны появляться в списке выбора, если инструкция содержит оператор UNION, INTERSECT или EXCEPT.

Я не знаю, почему это происходит, потому что я выбираю все в каждом операторе SELECT.

Select * FROM AccountAdminTable Where CollegeCode = 'A10' AND AdminLevel LIKE 'Account Administrator'
Union
Select * FROM AccountAdminTable Where CollegeCode = 'A10' AND AdminLevel LIKE 'Department Head/Director'
Union
Select * FROM AccountAdminTable Where CollegeCode = 'A10' AND AdminLevel LIKE 'Dean/Vice President'
Order By AdminLevel ASC

Это не работает:

Select * FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Account Administrator'
Union
Select * FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Department Head/Director'
Union
Select * FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Dean/Vice President'
Order By Case
    When AdminLevel = 'Account Administrator' Then 1
    When AdminLevel = 'Department Head/Director' Then 2
    When AdminLevel = 'Dean/Vice President' Then 3
    Else 4 End ASC

Любойпомощь очень ценится!Ниже приведены некоторые примеры данных.

College Code| AdminLevel               | Name
A           | Account Administrator    | Bob
A           | Department Head/Director | Tim
A           | Dean/Vice President      | Jeff
B           | Account Administrator    | Gary
B           | Department Head/Director | Phil
B           | Dean/Vice President      | John
C           | Account Administrator    | Bill
C           | Account Administrator    | Larry

Ответы [ 3 ]

6 голосов
/ 30 апреля 2019

Вы знаете, вам действительно не нужно использовать UNION вообще здесь. Поскольку все ваши SELECTS взяты из одной таблицы, вы можете просто сделать это (обратите внимание, сокращения, используемые в моем псевдокоде ниже. Используйте правильные значения в вашем коде, очевидно):

Select * FROM AccountAdminTable 
Where CollegeCode = 'A'
AND AdminLevel IN ('Account Administrator','Dept HD','Dean/VP')
ORDER BY CASE {Your CASE Expression}
4 голосов
/ 30 апреля 2019

У вас есть 2 варианта:

  • Используйте производную таблицу, чтобы использовать CASE в ORDER BY.
SELECT *
FROM(
         Select * FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Account Administrator'
        Union
        Select * FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Department Head/Director'
        Union
        Select * FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Dean/Vice President'
        )t
Order By Case 
        When AdminLevel = 'Account Administrator' Then 1
        When AdminLevel = 'Department Head/Director' Then 2
        When AdminLevel = 'Dean/Vice President' Then 3
        Else 4 End ASC;

* Или добавьте столбец, который определяет порядок.

Select *, 1 AS OrderCol FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Account Administrator'
Union
Select *, 2 AS OrderCol FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Department Head/Director'
Union
Select *, 3 AS OrderCol FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Dean/Vice President'
Order By OrderCol;

В любом случае, вы можете изменить UNION на UNION ALL для повышения производительности. Если вы на самом деле не удаляете дубликаты.

2 голосов
/ 30 апреля 2019

Другой вариант написания вашего запроса:

SELECT AccountAdminTable.*
FROM AccountAdminTable
INNER JOIN (VALUES
    (1, 'Account Administrator'),
    (2, 'Dept HD'),
    (3, 'Dean/VP')
) AS vlist(Sort, AdminLevel) ON AccountAdminTable.AdminLevel = vlist.AdminLevel
WHERE CollegeCode = 'A'
ORDER BY vlist.Sort

Или, лучше, создать таблицу для уровней администратора и ссылаться на нее по внешнему ключу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...