Microsoft Access: выберите один адрес электронной почты для каждой компании - PullRequest
0 голосов
/ 29 октября 2018

У меня есть таблица, которая выглядит примерно так:

+---------+---------+-----------------+
| company |  type   |      email      |
+---------+---------+-----------------+
| ID001   | user    | user@email.com  |
| ID001   | admin   | admin@email.com |
| ID002   | user    | ...             |
| ID002   | admin   | ...             |
| ID002   | janitor | ...             |
| ID003   | admin   | ...             |
+---------+---------+-----------------+

Я бы хотел SELECT все адреса электронной почты, где type = user. Если user не существует, следует выбрать admin. Если этого также не существует, следует выбрать janitor и т. Д.

В конце мне нужен результат только с одним адресом электронной почты на компанию. Я смог отсортировать по type и затем использовать SELECT TOP 1 так:

SELECT TOP 1
  contacts.company,
  contacts.type,
  contacts.email
FROM contacts
WHERE contacts.Email <> "" AND contacts.company = "ID001"
ORDER BY 
IIf([contacts.type] = 'user',1,
IIf([contacts.type] = 'admin',2,
IIf([contacts.type] = 'janitor',3,
4)))) ASC)

Это работает только для одной конкретной компании, см. Пункт WHERE . Как я могу заставить это работать для всей таблицы?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Рассмотрим условный агрегатный запрос с вложенным IIF():

SELECT c.company,
       MAX(IIF(c.type = 'user' AND c.Email IS NOT NULL, c.Type,
               IIF(c.type = 'admin' AND c.Email IS NOT NULL, c.Type,
                   IIF(c.type = 'janitor' AND c.Email IS NOT NULL, c.Type, NULL)
                  )
               )
          ) As final_type,
       MAX(IIF(c.type = 'user' AND c.Email IS NOT NULL, c.Email, 
               IIF(c.type = 'admin' AND c.Email IS NOT NULL, c.Email,
                   IIF(c.type = 'janitor' AND c.Email IS NOT NULL, c.Email, NULL)
                  )
               )
          ) As final_email
FROM contacts c
GROUP BY c.company
0 голосов
/ 29 октября 2018

Поскольку ваша таблица contacts не имеет поля первичного ключа, вы можете использовать что-то вроде следующего:

SELECT
    t.company,
    t.type,
    t.email
FROM
    contacts t
WHERE
    t.company & t.type =
    (
        SELECT TOP 1 
            contacts.company & contacts.type
        FROM 
            contacts
        WHERE 
            contacts.Email IS NOT NULL AND contacts.company = t.company
        ORDER BY 
            IIf([contacts.type] = 'user',1,
            IIf([contacts.type] = 'admin',2,
            IIf([contacts.type] = 'janitor',3,
            4))) ASC
    )

Это предполагает, что объединение компании и типа будет уникальным в наборе данных.

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