2016-05-16 13 views
-1

Ich schreibe eine Abfrage, wo ich eine Beschriftung basierend auf dem Inhalt aus mehreren Spalten zurückgeben muss. Unten sind die Spaltenbeispiele.Mehrere Kriterien in Access Query

Source Table

Was brauche ich für alle Konten zurück, die nur a1 in der Agentur Spalten dann das Etikett von undesignated zugewiesen werden müssen, wobei a1 in einer der Agentur Spalten ist, und eine andere Agentur Name (ex a3) ist in einem, wenn die anderen Spalten, dann eine Bezeichnung von teilweise bezeichnet würde zugewiesen werden.

unten wäre die Spalte, in der die Ergebnisse gehen würden.

[resultierende label] [2]

Die Grund IIF oder Switch-Funktion offenbar nicht auf die Bedürfnisse gegeben, dass es mehrere Kriterien für jedes Label erfüllt werden.

Weitere Informationen zur Tabelle. Additional Table information

+0

Sind Agentur1, Agentur2 und Agentur3 die einzigen drei Spalten, die auf die a (x) -Werte prüfen? – Sturgus

+0

Danke, dass Sie sich die Zeit genommen haben zu antworten. Es könnte bis zu 20 Spalten geben. Ich fügte ein anderes Bild der tatsächlichen Tabellenüberschriften und der Beispieldaten von der Tabelle hinzu, die ich verwende. – Don85203

+0

Sie werden feststellen, dass diese Abfrage extrem schwierig zu erstellen ist. Dies liegt ausschließlich daran, dass die Daten sehr schlecht modelliert sind. Wenn Agentur + Konten (+ $ Designated) in einer Schnittstellentabelle (viele: viele) platziert würden, wäre dieses Problem trivial. Was sind die Kriterien für die Anzahl der DX_Agency-Spalten? Du sagst es geht bis D20_Agency !? – Sturgus

Antwort

0

Um das gewünschte Ergebnis in Access zu erreichen, würde ich die erste Tabelle un-Dreh versuchen, und die min und max von jeder Agentur als solche erhalten:

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#] 

ich diese Abfrage speichern könnte als " MinMaxAgencyQuery "und dann zum Erstellen meiner Spalte" Brieftyp "verwenden. Dann würde ich diese Spalte in einer Union-Abfrage bauen wie folgt:

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" 

Natürlich ist diese Lösung auf „a1“ beruht eigentlich „a1“ (und damit zu sein, weniger als die anderen Agenturen, wenn eine Zeichenfolge zu tun -Vergleich).

Wenn ich das alles in derselben Abfrage tun muß, würde ich meine erste Abfrage in jedem der drei unioned Abfragen wie so ersetzen:

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" 

Sie angegeben nie was von Account # 's wird, dass haben keine Werte für Agentur1, Agentur2 und Agentur3 und würden daher bei dieser Lösung nicht angezeigt.

+0

Wenn nur MS Access gemeinsame Tabellenausdrücke unterstützt, wäre die letzte Abfrage viel kürzer (und schneller ausgeführt) ... – Sturgus