2016-05-16 2 views
-1

Я пишу запрос, где мне нужно вернуть метку на основе содержимого из нескольких столбцов. Ниже приведены примеры столбцов.Несколько критериев в запросе доступа

Source Table

Что мне нужно вернуть для всех учетных записей, которые имеют только a1 в столбцах агентского то метка не целевой быть назначена, где a1 находится в одном из столбцов агентств и другого названия агентства (например, a3) находится в одном, если другие столбцы, тогда будет назначена метка частично назначенного.

ниже будет столбец, в который будут отправлены результаты.

[в результате этикетка] [2]

Основной IIF или переключатель функция не кажется, чтобы удовлетворить потребности, учитывая, что там было несколько критериев должны быть выполнены для каждой метки.

Дополнительная информация о таблице. Additional Table information

+0

Являются ли агентство1, агентство2 и агентство3 единственными тремя столбцами для проверки значений a (x)? – Sturgus

+0

Спасибо, что нашли время ответить. Может быть до 20 столбцов. Я добавил другое изображение фактических заголовков таблиц и образцов данных из таблицы, которую я использую. – Don85203

+0

Вы обнаружите, что этот запрос становится чрезвычайно сложным для создания. Это происходит исключительно потому, что данные моделируются очень плохо. Если агентские + счета (+ $ Обозначенные) были помещены в таблицу пересечений (много: много), то эта проблема была бы тривиальной. Каковы критерии для количества столбцов DX_Agency? Вы говорите, что он подходит к D20_Agency !? – Sturgus

ответ

0

Чтобы достичь желаемого результата в Access, я хотел бы попытаться не-стержень в первой таблице и получить минимальное и максимальное каждого учреждения, как, например:

SELECT A.[Account#], MIN(A.Agency) AS MinAgency, MAX(A.Agency) AS MaxAgency 
FROM 
(

    SELECT B.[Account#], B.Agency1 AS Agency 
    FROM SourceTable AS B 
    UNION 
    SELECT C.[Account#], C.Agency2 
    FROM SourceTable AS C 
    UNION 
    SELECT D.[Account#], D.Agency3 
    FROM SourceTable AS D 

) AS A 
GROUP BY A.[Account#] 

Я мог бы сохранить этот запрос как " MinMaxAgencyQuery ", а затем используйте его для создания столбца« Тип письма ». Тогда, я хотел бы построить этот столбец в запросе на объединение следующим образом:

SELECT E.[Account#], "Undesignated" AS [Letter Type] 
FROM SourceTable AS E LEFT JOIN MinMaxAgencyQuery AS A ON E.[Account#] = A.[Account#] 
WHERE MinAgency = "a1" AND MaxAgency = "a1" 

UNION 

SELECT E.[Account#], "PartiallyDesignated" AS [Letter Type] 
FROM SourceTable AS E LEFT JOIN MinMaxAgencyQuery AS A ON E.[Account#] = A.[Account#] 
WHERE MinAgency = "a1" AND MaxAgency <> "a1" 

UNION 

SELECT E.[Account#], "Designated" AS [Letter Type] 
FROM SourceTable AS E LEFT JOIN MinMaxAgencyQuery AS A ON E.[Account#] = A.[Account#] 
WHERE MinAgency > "a1" 

Конечно, это решение основано на «a1» на самом деле является «a1» (и, таким образом, меньше, чем другие учреждения при выполнении строки -comparison).

Если мне нужно сделать все это в одном запросе, я бы заменить мой первый запрос в каждом из трех unioned запросов следующим образом:

SELECT E.[Account#], "Undesignated" AS [Letter Type] 
FROM SourceTable AS E LEFT JOIN (
SELECT A.[Account#], MIN(A.Agency) AS MinAgency, MAX(A.Agency) AS MaxAgency 
    FROM 
    (

     SELECT B.[Account#], B.Agency1 AS Agency 
     FROM SourceTable AS B 
     UNION 
     SELECT C.[Account#], C.Agency2 
     FROM SourceTable AS C 
     UNION 
     SELECT D.[Account#], D.Agency3 
     FROM SourceTable AS D 

    ) AS A 
GROUP BY A.[Account#] 

) AS F ON E.[Account#] = F.[Account#] 
WHERE MinAgency = "a1" AND MaxAgency = "a1" 

UNION 

SELECT E.[Account#], "PartiallyDesignated" AS [Letter Type] 
FROM SourceTable AS E LEFT JOIN (
SELECT A.[Account#], MIN(A.Agency) AS MinAgency, MAX(A.Agency) AS MaxAgency 
    FROM 
    (

     SELECT B.[Account#], B.Agency1 AS Agency 
     FROM SourceTable AS B 
     UNION 
     SELECT C.[Account#], C.Agency2 
     FROM SourceTable AS C 
     UNION 
     SELECT D.[Account#], D.Agency3 
     FROM SourceTable AS D 

    ) AS A 
GROUP BY A.[Account#] 

) AS F ON E.[Account#] = F.[Account#] 
WHERE MinAgency = "a1" AND MaxAgency <> "a1" 

UNION 

SELECT E.[Account#], "Designated" AS [Letter Type] 
FROM SourceTable AS E LEFT JOIN (
SELECT A.[Account#], MIN(A.Agency) AS MinAgency, MAX(A.Agency) AS MaxAgency 
    FROM 
    (

     SELECT B.[Account#], B.Agency1 AS Agency 
     FROM SourceTable AS B 
     UNION 
     SELECT C.[Account#], C.Agency2 
     FROM SourceTable AS C 
     UNION 
     SELECT D.[Account#], D.Agency3 
     FROM SourceTable AS D 

    ) AS A 
GROUP BY A.[Account#] 

) AS F ON E.[Account#] = F.[Account#] 
WHERE MinAgency > "a1" 

Вы никогда не указано, что становится счета # о том, что не имеют значений для Агентства1, Агентства2 и Агентства3, и поэтому они не будут показаны с учетом этого решения.

+0

Если только MS Access поддерживает общие табличные выражения, последний запрос будет намного короче (и выполняется быстрее) ... – Sturgus

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