2016-12-12 5 views
1

Я пытаюсь создать базу данных для своей организации о наших сотрудниках и соответствующие лицензии, которые они хранят для своей работы. Есть 100s рабочих мест и лицензий, которые я bucketed на три ведра, чтобы попытаться выровнять их: 1. Общие Employee, 2. Администрация, 3. УслугиMS Access: Создать рейтинг/Приоритет и показать высочайшую строку

Однако у нас есть несколько вопросов:

  1. , поскольку лицензии также имеют одобрения, поэтому кто-то, кто считается обслуживающим лицом, но имеет лицензию «общего сотрудника», все еще может работать в сфере услуг (потому что мы собираемся предположить, что у них есть одобрение на работу в сфере услуг)

  2. Мы не хотят удалять пользователей, если их лицензия и позиции могут не совпадать.

  3. Педагоги могут иметь более чем одну лицензию в той же группе/ведро попу колодце

Так что я хочу, чтобы создать ранжирование/приоритет для этих отношений между лицензией и позиции (см ниже рейтинга) и Я хочу создать запрос так, чтобы, если у человека есть несколько лицензий (таким образом, создается более одной строки), мы можем сохранить верхнюю строку, независимо от того, является ли она 1, 2 или 3 (путем определения приоритетов 1 с более чем 2 с по 3 с) и удалите нижние строки.

Perfect Match (Role - Лицензия):

  • Общие - Общие = 1
  • Услуги - Услуги = 1
  • Admin - Admmin = 1

Good Match:

  • Общие сведения - Услуги = 2
  • Услуги - Общие = 2

Bad Match:

  • Общие - Администратор = 3
  • Услуги - Администратор = 3
  • Admin - Услуги = 3
  • Admin - Общие = 3

Возможно ли это?

ответ

0

Я бы решил это, создав 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: изменено макс до мин

+0

Этот запрос не работает в MS Access. –

+0

@GordonLinoff - мне все нормально ... что мне не хватает? – jleach

+0

@ jdl134679. , , 'union 'в подзапросе. –

 Смежные вопросы

  • Нет связанных вопросов^_^