Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Doppelte Werte beseitigen

Begonnen von Datenwelt, August 23, 2011, 12:42:05

⏪ vorheriges - nächstes ⏩

Datenwelt

Hallo zusammen,

ich habe das Problem, dass durch die LEFT JOINS doppelte Einträge entstehen (weis allerdings nicht genau, warum. Wäre schön wenn mir das jmd. anbei erklären könnte). Normalerweise müsste derlei mit COUNT(DISTINCT ...) zu lösen sein, doch Access bietet diese Funktion nicht. Und ich habe schon allerlei mit DISTINCT rumgespielt, bekomme aber keine Lösung hin. Das Endergebnis sollte so aussehen:

VSNR   R    V
...1      1     1
...2      0     1
...3      1     0

und nicht

VSNR   R    V
...1      2     2
...2      0     1
...3      1     0

wie es im Augenblick der Fall ist.

Kann mir jmd. weiterhelfen?

SELECT ee.VSNR, COUNT(vv.FINANZ_ENDE_KZ) AS V, COUNT(rr.FINANZ_ENDE_KZ) AS R

FROM (Ergebnis AS ee

LEFT JOIN
(SELECT vv.VSNR, vv.FINANZ_ENDE_KZ
FROM Ergebnis AS vv WHERE FINANZ_ENDE_KZ="V")  AS vv ON ee.VSNR = vv.VSNR)

LEFT JOIN (SELECT rr.VSNR, rr.FINANZ_ENDE_KZ
FROM Ergebnis AS rr WHERE FINANZ_ENDE_KZ="R")  AS rr ON vv.VSNR = rr.VSNR

GROUP BY ee.VSNR;

DF6GL

Hallo,


und warum führst Du die Diskussion nicht hier weiter:

http://www.ms-office-forum.de/forum/showthread.php?t=281398

Das Ganze nochmal von vorne nachfragend durchzukauen, führt zu nichts Anderem.

Datenwelt

Weil ich der einzige bin, der in diesem Thread postet und die die Ausgangsfrage des Threads nicht mehr die akt. Frage ist. Dieser Thread erlaubt es, sofort das Problem im Kern zu erfassen. Hoffe ich zumindest.

Habe ich die Etikette verletzt? Ich hoffe nicht, und hoffe weiterhin auf etwas Aushilfe. Ein Tipp, wo der Hund begraben liegt würde mir vermutlich schon weiterhelfen.

DF6GL

Hallo,

naja Etikette...  Crosspostings, wenn auch abrupt umgeschwenkt , konsternieren halt die Leute, die bis jetzt geratschlagt haben und die Leute, die von Deinem Problem und den vorangegangenen Ratschlägen  nichts wissen.



Wie auch immer, 

es kennt niemand hier die eigentliche Aufgabe , die die Abfrage leisten soll (Tabellen, Felder)  und den Algorithmus, den Du in diese Subquerys pressen willst.

Left Joins als solche sind eher hinderlich in auswertenden Abfragen und deuten m. M. nach auf inkonsequentes Tabellendesign bzgl. Normierung und ref. Integrität hin.
Ohne genaue Beschreibung der benutzten Tabellen und der gewünschter Logik, die die abfrage(n) verkörpern sollen, sehe ich mich nicht in der Lage, einen vernünftigen (und anderen) Ratschlag als den im anderen Forum gegebenen zu machen.



Datenwelt

#4
Auf das Tabellendesign habe ich leider keinen Einfluss.

Aber den gewünschten Effekt kann ich beschreiben:

Für jede Identifikationsnummer der Spalte "VSNR" soll angezeigt werden, ob ein Brief von Typ V und/oder Typ R verschickt wurde.  Diese Briefe befinden sich in der Spalte "FINANZ_ENDE_KZ".
Identifikationsnummer (VSNR) und versandte Briefart (FINANZ_ENDE_KZ) befinden sich beide in der Tabelle "Ergebnis". Das Ergebnis muss(!) vom Aussehen her die oben beschriebene Form haben, also [VSNR], [V], [R]; mit V und R gleich 0 oder 1. Die Null zeigt an, dass kein Brief dieses Typs für die Identifikationsnummer versandt wurde. Die Eins entspricht dem Gegenteil.

Tabelle Ergebnis
VSNR, FINANZ_ENDE_KZ, ...
..1      R
..1      V
..2      V
..3      R

Die Endform soll, wie beschrieben, wie folgt aussehen:

VSNR   R    V
...1      1     1
...2      0     1
...3      1     0

und nicht

VSNR   R    V
...1      2     2
...2      0     1
...3      1     0

Letzteres, mit den zweien, ist der Status Quo.

Die LEFT JOINS benutze ich, um am Ende auch wirklich alle Identifikationsnummern im Ergebnis zu haben. INNER JOINS würden dazu führen, dass Zeilen ohne V oder R in FINANZ_ENDE_KZ aus der Ergebnismenge fallen.

database

#5
Hallo,

ein Versuch ...  ::)

Ausgangssituation eine Tabelle 'Ergebnis' mit folgenden Daten:

VSNR   FINANZ_ENDE_KZ
1         R
1         V
2         V
3         R
2         R
4         V

.... und eine Abfrage mit folgender SQL:


SELECT Ergebnis.VSNR, Max(IIf([Ergebnis].[FINANZ_ENDE_KZ]="R",1,0)) AS R, Max(IIf([Ergebnis_1].[FINANZ_ENDE_KZ]="V",1,0)) AS V
FROM Ergebnis INNER JOIN Ergebnis AS Ergebnis_1 ON Ergebnis.VSNR = Ergebnis_1.VSNR
GROUP BY Ergebnis.VSNR;


...liefert folgendes Recordset:

VSNR   R   V
1         1   1
2         1   1
3         1   0
4         0   1

Vorausgesetzt ist, dass die Tabelle Ergebnis in der gezeigten Form bereits erzeugt wurde und dass nicht mehr als 2 Einträge pro VSNR existieren.

HTH

Datenwelt

Dankeschön!

Es wird etwas dauern, knapp zwei Wochen, bis ich die Abfrage im Einsatz testen kann.

Ich muss mich wohl mit diesen Access Funktionen (Ilf etc.) auseinandersetzen. Aber eine Frage am Rande. Wäre das auch über altbackenes SQL (ausschließlich mit Funktionen à la count, max, min etc.) möglich gewesen?

Gruß Datenwelt

database

Hallo,

die SQL oben ist keine große Hexerei, es wird lediglich eine Beziehung der Tabelle Ergebnis auf sich selbst hergestellt.
Dann wird aus der Originaltabelle das Feld 'R' abgefragt und in einer Bedingung der Wert 1 oder 0 gesetzt.
Analog dazu wird mit dem Feld 'V' aus dem Alias 'Ergebnis_1' verfahren.
Die Max-Funktion dient in dem Fall dann dazu den höchten ermittelten Wert des gruppierten Ergebnissatzes jeder VSNR anzuzeigen - damit kommen die 1-er an die oberste Stelle und werden RICHTIG angezeigt.

Zur Sache mit dem IIF - das ist eben eine Access-Spezialität, unter T-SQL des SQL-Servers müsste dieses Konstrukt eben in ein CASE WHEN ELSE Konstrukt umgebaut werden.
Mit Count, Max, Min etc so wie du das angesprochen hast wäre das Ergbenis wie oben nicht möglich, da hierbei keine Umleitung der Zeileneinträge in Spalten (R und V - Werte) zu realisieren ist.
Es wird ja pro Zeile ermittelt ob ein Eintrag mit R oder V besteht und abhängig davon wird eine 1 oder eine 0 in einer neuen Spalte erzeugt - das ist mit einer Zählung (Count) im üblichen Verfahren nicht zu realisieren