PDA

Vollständige Version anzeigen : Kleinster Wert bei mehreren Sub Werten


dhartung
09.05.2011, 13:25
Hallo Zusammen,

ich habe zwei Tabellen. In der Ersten haben wir "Probleme" in der Zweiten die dazugehörenden Lösungen. Das ist eine 1 zu n beziehung. Es kann zu einem Problem mehrere Teillösungen geben. Diese Teillösungen müssen bis zu einem vereinbarten Tag gelöst werden sollte dieser überschritten werden wird es mit 0 gekennzeichnet.
Ist einer der Teillösungen zuspät ist auch das Problem verspätet und sollte in dem Fall auch eine 0 erhalten.
Wie würde denn die Abfrage lauten?

Hier der SQL code einer vereinfachten Tabelle. Ich bräuchte eine neue Spalte die Table2.[on Time] heist und 0 hat sobald eines seiner "Kinder" eine 0 hat.


SELECT Table1.ID, Table1.Description, Table2.ID, Table2.Description, Table2.[on Time]
FROM Table2 RIGHT JOIN Table1 ON Table2.ID_Table1 = Table1.ID;

hcscherzer
09.05.2011, 13:46
Ich sehe kein Datumsfeld in Deinen Tabellen.
Woran erkennst Du denn wann es zu spät ist?

dhartung
09.05.2011, 16:04
Es gibt schon ein Datumswert. Dieser wird gegen das heutige Datum im verhältniss gesetzt und so entsteht der Wert 1 = "On Time" und 0 "Not On Time".

Thomas Möller
09.05.2011, 17:02
Hallo Daniel,

Ich bräuchte eine neue Spalte die Table2.[on Time] heist und 0 hat sobald eines seiner "Kinder" eine 0 hat.

vielleicht erstellst Du als erstes eine Abfrage, die dieses Ergebnis liefert. Diese Abfrage kannst Du dann mit den Tabellen in der Abfrage verknüpfen.

CU

dhartung
09.05.2011, 17:53
Hallo,

Das mit dem Datum hab ich und es ist nicht das Problem.

Ich muss nur wissen wie ich entweder den grössten Wert der Kinder erhalte oder was für meinen Fall zutreffen würde den kleinsten Wert. Dieser entspricht in meinem Fall das einer der Kinder nicht on time ist.

hcscherzer
09.05.2011, 18:28
Moin Daniel,

von Kindern war ja bislang ebenso wenig zu sehen wie von Datumswerten.
Wie wäre es, wenn Du uns mal eine Screenshot des Beziehungsfensters zeigtest, damit man mal durch Deine Struktur blickt.

dhartung
10.05.2011, 07:22
Hallo,

ich habe mal eine die Test Datenbank angehängt.

Diese zeigt die zwei Tabellen.

1. Tabelle mit all den Problemen.
2. Tabelle mit den dazugehörigen Lösungen (können manchmal aufgeteilt werden.)

Ich brauche eine Abfrage in der ich sehen kann das die Probleme rechtzeitig gelöst worden sind. Das ist nur der Fall wenn alle Lösungen rechtzeitig gelöst worden sind.
Ich habe in der 1. Tabelle eine Spalte gemacht mit den erhoften resultat. "Problem_solved_on_Time"
Diese Spalte gibt es normalerweise nicht dort aber soll in der Abfage zeigen was das Ergebnis ist, und mein Problem ist das ich nicht lösen kann.

Thomas Möller
10.05.2011, 17:12
Hallo Daniel,

Ich brauche eine Abfrage in der ich sehen kann das die Probleme rechtzeitig gelöst worden sind. Das ist nur der Fall wenn alle Lösungen rechtzeitig gelöst worden sind.

ich bleibe bei meinem Vorschlag: ;)
Als erstes erstellst Du Dir eine Abfrage, in der Du ermittelst, ob die einzelnen Probleme pünktlich gelöst wurden. So wie ich es verstanden habe ist ein Problem pünktlich gelöst, wenn

1. das Feld SolutionDate nicht leer ist und
2. der Wert für SolutionDate vor dem Wert für DueDate liegt.

Diese Bedingungen könnte man bei in einer Abfrage wie folgt ausdrücken:

Not IsNull([SolutionDate]) And Nz([SolutionDate],#12/31/9999#)<[DueDate]

Da für den zweiten Teil des Ausdrucks ein Ersatzwert für den Null-Fall benötigt wird, der auf jeden Fall noch nicht erreicht ist, kann man auf den ersten Teil der Prüfung bei selbem Ergebnis verzichten:

Nz([SolutionDate],#12/31/9999#)<[DueDate]

Mit diesem Ausdruck kannst Du Dir eine Abfrage erstellen, die Dir für jede Lösung ausgibt, ob Sie rechtzeitig erfolgt ist:

SELECT Table2.ID_Table1,
Table2.Description,
Table2.DueDate,
Table2.SolutionDate,
Nz([solutiondate],#12/31/9999#)<[DueDate] AS OnTime
FROM Table2;

Diese Abfrage speicherst Du z.B. unter dem Namen qry_SolutionOnTime. Die Abfrage liefert Dir für jede Lösung eine boolschen Wert, der Dir anzeigt, ob die Lösung OnTime erbracht wurde oder eben nicht.

Diese Abfrage kannst Du in einer weiteren Abfrage nach dem Problem (in diesem Fall der ID aus Tabelle 1) gruppieren. Für die Spalte OnTime verwendest Du die Funktion Max. Der SQL-String der Abfrage sieht dann so aus:

SELECT qry_SolutionOnTime.ID_Table1,
Max(qry_SolutionOnTime.OnDate) AS SolvedOnTime
FROM qry_SolutionOnTime
GROUP BY qry_SolutionOnTime.ID_Table1;

Die Abfrage liefert Dir als Ergebnis zu jedem Problem die Information, ob alle Lösungen OnTime erfolgt sind. Wenn auch nur eine Lösung noch offen ist oder verspätet erfolgt ist, liefert die Abfrage 0 und damit den boolschen Ausdruck False zurück.
Diese Abfrage speicherst Du ebenfalls, z.B. unter dem Namen qry_ProblemSolvedOnTime.

In einer letzten Abfrage verknüpfst Du dann die Tabelle mit den Problemen und die soeben erstellte Abfrage über die Problem ID. Nun kannst Du Dir die gewünschten Ergebnisse gemeinsam ausgeben lassen:

SELECT Table1.ID,
Table1.Description,
qry_ProblemSolvedOnTime.SolvedOnTime
FROM qry_ProblemSolvedOnTime INNER JOIN Table1 ON
qry_ProblemSolvedOnTime.ID_Table1 = Table1.ID;

Als Ergebnis kommt heraus, dass in Deinen Beispieldaten nur das Problem 2 On Time gelöst wurde.

HTH

dhartung
11.05.2011, 06:44
1000 Dank für deine Mühe und der inspiration....

Mir kam eine Idee nach deim ich versucht habe deine Lösung zu implementieren und habe es nun in einer Abfrage sauber lösen können.

Dazu habe ich eine SubQuery verwendet und siehe da es funktioniert.


(select Min( IIf(IsDate([T2.SolutionDate]),IIf([T2.DueDate]>[T2.SolutionDate],1,0),IIf(Now()>[T2.DueDate],0,1)) ) from Table2 as T2 Where Table1.ID = T2.ID_Table1) AS ProblemOnTime


Um die ganze Lösung zu sehen habe ich das Testfile wieder hochgeladen.