Я бы решил это, создав uninoned sub query, где я объясняю значение каждого ранга в каждом из трех подзапросов. Затем я заказываю внешний запрос в поле ранга.
В нижеследующем запросе группируются все 1 сверху, затем 2 и 3. Предполагая, что вы хотите сначала сгруппировать по персоне, вы бы указали, какое поле может однозначно идентифицировать человека в порядке. например: «ORDER BY EmployerNo, Rank».
Кроме того, если вы не хотите, чтобы поле ранга отображалось на выходе, просто объясните, какие поля следует выбирать во внешнем запросе вместо «SELECT *», который я использую ниже.
SELECT *
FROM(
SELECT 1 as rank, *
FROM YourTable
WHERE (Role = "General" and License = "General")
OR (Role = "Services" and License = "Services")
OR (Role = "Admin" and License = "Admin")
UNION
SELECT 2 as rank, *
FROM YourTable
WHERE (Role = "General" and License = "Services")
OR (Role = "Services" and License = "General")
UNION
SELECT 3 as rank, *
FROM YourTable
WHERE (Role = "General" and License = "Admin")
OR (Role = "Services" and License = "Admin")
OR (Role = "Admin" and License = "Services")
OR (Role = "Admin" and License = "General")
) as a
ORDER BY Rank
Редактировать: добавление запрашиваемого варианта, чтобы сообщать только самую высокую оценку для каждого сотрудника и лицензии. Итак, я присоединяюсь к запросу из самого себя с небольшим изменением. Это изменение заключается в том, чтобы сделать запрос агрегированным запросом, в котором сообщалось только о максимальном рейтинге для каждой лицензии и сотрудника. (Я предполагаю имя поля сотрудника). Когда мы присоединяемся к этим запросам, мы сообщим обо всех полях из исходного запроса, которые соответствуют MaxRank, лицензии # и сотруднику #.
SELECT a.*
FROM(
SELECT 1 as rank, *
FROM YourTable
WHERE (Role = "General" and License = "General")
OR (Role = "Services" and License = "Services")
OR (Role = "Admin" and License = "Admin")
UNION
SELECT 2 as rank, *
FROM YourTable
WHERE (Role = "General" and License = "Services")
OR (Role = "Services" and License = "General")
UNION
SELECT 3 as rank, *
FROM YourTable
WHERE (Role = "General" and License = "Admin")
OR (Role = "Services" and License = "Admin")
OR (Role = "Admin" and License = "Services")
OR (Role = "Admin" and License = "General")
) as a
INNER JOIN (
SELECT Min(rank) as maxrank, License, employee
FROM(
SELECT 1 as rank, *
FROM YourTable
WHERE (Role = "General" and License = "General")
OR (Role = "Services" and License = "Services")
OR (Role = "Admin" and License = "Admin")
UNION
SELECT 2 as rank, *
FROM YourTable
WHERE (Role = "General" and License = "Services")
OR (Role = "Services" and License = "General")
UNION
SELECT 3 as rank, *
FROM YourTable
WHERE (Role = "General" and License = "Admin")
OR (Role = "Services" and License = "Admin")
OR (Role = "Admin" and License = "Services")
OR (Role = "Admin" and License = "General")
) as a
GROUP BY License, employee
) as b on a.rank = b.maxrank and a.License = b.License and a.employee = b.employee
ORDER BY Rank
Edit # 2: изменено макс до мин
Этот запрос не работает в MS Access. –
@GordonLinoff - мне все нормально ... что мне не хватает? – jleach
@ jdl134679. , , 'union 'в подзапросе. –