SQL: Gruppierung und Anzahl

TS-JC

Erfahrenes Mitglied
Hallo zusammen,

direkter Einstieg mal von mir :-)

Tabelle:
Code:
Feld 1 - Feld 2
--------------------
123    - A
123    - B
123    - B
124    - A
125    - B

Gewünschtes Ergebnis:
Code:
Feld 1 - A - B
-----------------
123    - 1 - 2

Soll heissen, ich möchte nach der Nummer gruppieren und wissen wie viele As und Bs es gibt. Aber nur, wenn es jeweils min. ein A und min. ein B gibt. Somit werden Zeile 4 und 5 nicht berücktsichtigt.

Hinbekommen habe ich es in Access per Kreuztabellenabfrage auf die nocht eine Abfrage zugreift, jedoch habe ich dann 3 Abfragen insgesamt, da die erste Tabelle auch schon eine Abfrage ist. Ist zwar eine Lösung, aber nicht das Optimum.

thx4help
 
Zuletzt bearbeitet:
Hallo,

mit MySQL funktioniert Folgendes:
SQL:
SELECT Feld1, SUM(Feld2='A') AS A, SUM(Feld2='B') AS B
FROM Tabelle
GROUP BY Feld1
HAVING SUM(Feld2='A') > 0 AND SUM(Feld2='B') > 0
Keine Garantie, dass das Access auch schluckt.

Grüße,
Matthias
 
Moin TS-JC,

im Prinzip ist Matthias' Lösung vollkommen richtig.
SQL-syntaktisch und logisch gesehen.

Nur leider holen Dich bei Access die Interna ein, die eigentlich gar nicht interessant sein sollten bei SQL-Statements, nämlich die Frage, wie wohl die Access-CoderInnen die Werte TRUE/FALSE darstellen.

Okay, die haben sich dafür entscheiden, als Zahlenäquivalent zu wählen:
* für TRUE (-1) und
* für FALSE ( 0)

Entsprechend wäre für die SUM()-Berechnung eine klitzekleine Anpassung nötig...
SQL:
SELECT Feld1,
 SUM( Feld2='A')*-1 AS A, 
 SUM( Feld2='B')*-1 AS B
 FROM Tabelle
GROUP BY Feld1
Having 
 SUM( Feld2='A')  < 0
AND
 SUM( Feld2='B') <  0
.... die allerdings das Ganze fast unwartbar macht, weil erst nach dreimaligem Lesen die Erinnerung einsetzt, was sich der geneigte Statementverzapfer wohl dabei gedacht hat.
Ergebnis ist richtig, aber die Nachvollziehbarkeit fast Null.

Also wäre aus Lesbarkeitsgründen eine Umformulierung mit der Access-IIF()-Funktion der nächste Schritt:
SQL:
SELECT Feld1,
 SUM( IIF(Feld2='A', 1, 0)) AS A, 
 SUM( IIF(Feld2='B', 1, 0)) AS B
 FROM Tabelle
GROUP BY Feld1
Having 
SUM( IIF(Feld2='A', 1, 0)) > 0
AND
 SUM( IIF(Feld2='B', 1, 0)) > 0

Da mir das aber noch zu anstrengend zum Nachvollziehen der Statement-Logik wäre, wäre meine Empfehlung:
SQL:
Select *  From (
SELECT Feld1,
 SUM( IIF(Feld2='A', 1, 0)) AS A, 
 SUM( IIF(Feld2='B', 1, 0)) AS B
 FROM Tabelle
GROUP BY Feld1
) 
Where A >  0 And B > 0

Grüße
Biber
 
Zuletzt bearbeitet von einem Moderator:
Herzlichen Dank, war genau die Lösung.
Zwar ein wenig umständlich, aber immer noch besser als meine 3 verschachtelten Wenn() plus diverse Läge(), Links() und Rechts() mit Wert() welche ich bei einem anderen Problem heute eingesetzt hab ;-)
 
Zurück