Access 查询中的多个条件

Multiple criteria in Access query

我正在编写一个查询,我需要return一个基于多列内容的标签。以下是列示例。

Source Table

我需要 return 为所有在代理列中只有 a1 的帐户分配未指定的标签,其中 a1 在代理列之一中,另一个代理名称(例如a3) 如果在其他列中,则将分配部分指定的标签。

下面是结果所在的列。

[结果标签][2]

考虑到每个标签要满足多个条件,基本的 IIF 或 Switch 功能似乎无法满足需求。

其他 Table 信息。 Additional Table information

为了在 Access 中获得预期的结果,我会尝试取消第一个 table 的轴心并获得每个代理机构的最小值和最大值:

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",然后使用它来创建我的 "Letter Type" 列。 然后,我将在联合查询中构建此列,如下所示:

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"(因此,在进行字符串比较时少于其他机构)。

如果我需要在同一个查询中执行所有这些操作,我会在三个联合查询中的每一个中替换我的第一个查询,如下所示:

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"

您从未指定没有 Agency1、Agency2 和 Agency3 值的 account# 会变成什么样子,因此在此解决方案中不会显示它们。