PDA

Vollständige Version anzeigen : Wenn abfrage liefert doppelte Werte


Ingo Mergl
25.05.2012, 12:34
Hi,
ich habe eine Anfrage mit folgendem Kriterium:

Kriterium: Wenn([ObTyp]="BEST" Und [Bezeichnung] Wie [Präfix] & [Benennung] & [Suffix];"schlecht zu lagern";"gut zu lagern")

Wenn dieser zustand eintritt, sollen alle Artikel mit ObTyp BEST und alle die in der Bezeichnung die Kriterien beihalten als "schlecht zu lagern" eingestuft werden. Die anderen als gut zu lagern.

Meine Tabelle besteht aus 4000 Sätzen
Nachdem der Abfrage habe ich 4062 Sätze als Ergebnis
ich bekomme alle 4000 als "gut zu lagern" und die 62 Sätze die nach den Kriterien wirkich als schlecht zu lagern eingestuft sind, werden einfach dran gehängt.

Woran liegt das?
Kann da jemand helfen?

Vielen Dank

Atrus2711
25.05.2012, 12:36
Hi,

ist dieser Ausdruck wirklich als Kriterium eingestellt oder als berechnetes Feld?

Zeig doch mal die SQL.

maikek
25.05.2012, 12:37
Moin,
kannst du mal die SQL deiner Abfrage posten? Anhand des Kriteriums kann ich jetzt keinen Grund erkennen ...
maike

Ingo Mergl
25.05.2012, 12:44
SELECT IIf([ObTyp]="BEST" And [Bezeichnung] Like [Präfix] & [Benennung] & [Suffix],"schlecht zu lagern","gut zu lagern") AS Kriterium, [qry Fehlteile alle Projekte].ObTyp, [qry Fehlteile alle Projekte].Bezeichnung
FROM [qry Fehlteile alle Projekte], [Kriterium schlecht zu lagern]
GROUP BY IIf([ObTyp]="BEST" And [Bezeichnung] Like [Präfix] & [Benennung] & [Suffix],"schlecht zu lagern","gut zu lagern"), [qry Fehlteile alle Projekte].ObTyp, [qry Fehlteile alle Projekte].Bezeichnung;

Atrus2711
25.05.2012, 12:49
Hi,

die Datenquelle (FROM-Klausel der SQL) sollte doch wohl nur die [qry Fehlteile alle Projekte] sein. Du hast da noch einen Crossjoin drin (nach dem Komma).

Wenn du alle 4000 Sätze der Quellabfrage eintüten willst, brauchst du lediglich das berechnete Feld; eine Gruppierung ist unnötig.

Also:
SELECT IIf([ObTyp]="BEST" And [Bezeichnung] Like [Präfix] & [Benennung] & [Suffix],"schlecht zu lagern","gut zu lagern") AS Kriterium, [qry Fehlteile alle Projekte].ObTyp, [qry Fehlteile alle Projekte].Bezeichnung
FROM [qry Fehlteile alle Projekte];

maikek
25.05.2012, 12:50
Ah guck, was ist denn das:
FROM [qry Fehlteile alle Projekte], [Kriterium schlecht zu lagern]
ist das eine zweite Tabelle/Abfrage? Dann erzeugst du dadurch ein Kreuzprodukt ...
maike

Anne Berg
25.05.2012, 12:51
Hallo,

dann fragt sich wohl, wo "[Präfix] & [Benennung] & [Suffix]," dann herkommen sollen. ;)

Atrus2711
25.05.2012, 12:53
dann fragt sich wohl, wo "[Präfix] & [Benennung] & [Suffix]," dann herkommen sollen.
Wieso das? Es kommen ja keine unerwarteten Parameterfragen, also sind diese Angabe wohl auffindbar (z.B als Felder der Abfrage). Es tut ja, aber es tut falsch :)

Anne Berg
25.05.2012, 13:00
Sorry, aber woher weißt du das? Es würde mich nicht wundern, wenn die Tabelle genau wegen dieser Datenfelder hinzugefügt wurde.

Ingo Mergl
25.05.2012, 13:01
Bei deiner Lösung fragt er nach den Werten Präfix Benennung Suffix

Wenn ich die einfüge funzt es, aber wenn ich mir noch zusätzliche Werte aus der qry Fehlteile alle Projekte hinzufüge kommt die Meldung mit der Aggregatfunktion

Atrus2711
25.05.2012, 13:05
Gut, dann hatte Anne doch recht. Präfix, Benennung und Suffix müssen schon irgendwoher kommen.

In deiner Ur-SQL hattest du einen Crossjoin (Kreuzprodukt) drin, das "jeden Satz mit jedem Satz" verbindet. Dadurch hast du zuviele SÄtze.

Wie ist denn das Gesamtgefüge der Quelltabellen und -abfragen? Vermutlich wird statt des Crossjoins ein anderer Verknüpfungstyp nötig sein.

Ingo Mergl
25.05.2012, 13:06
Wie meinst Gesamtgefüge ? ^^

Atrus2711
25.05.2012, 13:19
Tabellen, Abfragen, Beziehungen

Anne Berg
25.05.2012, 13:34
Hallo,

ich hätte dazu jetzt noch folgende Idee:SELECT Q.ObTyp, Q.Bezeichnung,
IIF(IsNULL(K.Benennung), "gut zu lagern", "schlecht zu lagern") AS Kriterium
FROM [qry Fehlteile alle Projekte] AS Q LEFT JOIN [Kriterium schlecht zu lagern] AS K
ON Q.[Bezeichnung] = K.[Präfix] & K.[Benennung] & K.[Suffix];
Aber Achtung, die Abfrage kann wegen des "krummen" Joins nur im SQL-Modus gespeichert und bearbeitet werden.

Ingo Mergl
25.05.2012, 14:40
Ok
Vielen Dank,
werd ich probieren, wenn ich wieder Zugriff auf die Datenbank habe
und euch dann berichten

Ingo Mergl
29.05.2012, 07:51
Das hat super geklappt Anne

Habe aus dem [Bezeichnung] = K.[Präfix]
noch
[Bezeichnung] Like K.[Präfix]
gemacht.

Was muss ich nun tun wenn ich zusätzlich noch 2 Filter anwenden möchte?
ObTyp z.B nur "BEST" und Bruttogewicht >=200 kg?

Vielen Dank

Atrus2711
29.05.2012, 08:40
Die Kriterien sollten in die WHERE-Klausel gelangen, etwa so:
SELECT Q.ObTyp, Q.Bezeichnung,
IIF(IsNULL(K.Benennung), "gut zu lagern", "schlecht zu lagern") AS Kriterium
FROM [qry Fehlteile alle Projekte] AS Q LEFT JOIN [Kriterium schlecht zu lagern] AS K
ON Q. LIKE K.[Präfix] & K.[Benennung] & K.[Suffix]
[B]WHERE Typ = "Best" AND Bruttogewicht >= 200

Ingo Mergl
29.05.2012, 09:34
Die Kriterien sollten in die WHERE-Klausel gelangen, etwa so:
SELECT Q.ObTyp, Q.Bezeichnung,
IIF(IsNULL(K.Benennung), "gut zu lagern", "schlecht zu lagern") AS Kriterium
FROM [qry Fehlteile alle Projekte] AS Q LEFT JOIN [Kriterium schlecht zu lagern] AS K
ON Q. LIKE K.[Präfix] & K.[Benennung] & K.[Suffix]
[B]WHERE Typ = "Best" AND Bruttogewicht >= 200

Supi, fast das was ich brauche,
aber ich hätte dies schon gerne vorher.
Also das alle Teile die dem Kriterium entsprechen UND dem ObTyp "BEST" ODER >= 200kg sind als "schlecht zu lagern" eingestuft werden.

Atrus2711
29.05.2012, 10:09
Dann ist das wohl eher eine Bedingung, die in die Formel des berechneten Feldes gehört. Das schaffst du selbst, oder?

Ingo Mergl
29.05.2012, 10:46
Dann ist das wohl eher eine Bedingung, die in die Formel des berechneten Feldes gehört. Das schaffst du selbst, oder?

:(
Nein leider nicht ^^
Es kommt zwar keine Fehlermeldung, aber es funzt auch nicht
Entweder sehe ich den Wald vor lauter Bäumen nicht oder bin halt zu dappig.

Atrus2711
29.05.2012, 10:51
SELECT Q.ObTyp, Q.Bezeichnung,
IIF(IsNULL(K.Benennung) AND (Typ = "Best" OR Bruttogewicht >= 200), "gut zu lagern", "schlecht zu lagern") AS Kriterium
FROM [qry Fehlteile alle Projekte] AS Q LEFT JOIN [Kriterium schlecht zu lagern] AS K
ON Q.[Bezeichnung] LIKE K.[Präfix] & K.[Benennung] & K.[Suffix]

Ingo Mergl
29.05.2012, 11:18
SELECT Q.ObTyp, Q.Bezeichnung,
IIF(IsNULL(K.Benennung) AND (Typ = "Best" OR Bruttogewicht >= 200), "gut zu lagern", "schlecht zu lagern") AS Kriterium
FROM [qry Fehlteile alle Projekte] AS Q LEFT JOIN [Kriterium schlecht zu lagern] AS K
ON Q.[Bezeichnung] LIKE K.[Präfix] & K.[Benennung] & K.[Suffix]

Ich hatte es ja sogar mal so:
IIF(IsNULL(K.Benennung) AND (Q.ObTyp <> "BEST"), "gut zu lagern", "schlecht zu lagern")
aber dann sind trotzdem auch ObTyp dabei als "schlecht zu lagern", die nicht BEST sind

Atrus2711
29.05.2012, 11:32
Mein Vorschlag liefert dir:

gut zu lagern, wenn die Benennung fehlt und zusätzlich Typ = "Best" oder Gewicht >= 200. Die Zusatzfälle können auch gemeinsam auftreten.
schlecht zu lagern in allen anderen Fällen.


Wenn du was andres haben willst, brauchst du andere Kriterien. Aber ich habe dich so verstanden.

Ich hatte es ja sogar mal so:
IIF(IsNULL(K.Benennung) AND (Q.ObTyp <> "BEST"), "gut zu lagern", "schlecht zu lagern")
aber dann sind trotzdem auch ObTyp dabei als "schlecht zu lagern", die nicht BEST sind
Bei denen wird dann die Benennung nicht leer gewesen sein.

Anne Berg
29.05.2012, 13:18
Hallo,Also das alle Teile die dem Kriterium entsprechen UND dem ObTyp "BEST" ODER >= 200kg sind als "schlecht zu lagern" eingestuft werden.das sollte hiermit klappen:SELECT Q.ObTyp, Q.Bezeichnung,
IIF(Not IsNULL(K.Benennung) AND (Q.ObTyp = "Best" OR Q.Bruttogewicht >= 200), "schlecht zu lagern", "gut zu lagern") AS Kriterium
FROM [qry Fehlteile alle Projekte] AS Q LEFT JOIN [Kriterium schlecht zu lagern] AS K
ON Q.[Bezeichnung] LIKE K.[Präfix] & K.[Benennung] & K.[Suffix]Alles nur eine Frage der Logik... ;)

Ingo Mergl
29.05.2012, 14:49
Ihr seid SUPER !!!
Vielen Dank an Alle
Danke Anne !