![]() |
Datenbank: MSSQL • Version: 2000 • Zugriff über: irrelevant
SQL Syntax für Max Problem
Tach,
ich möchte eine View über 3 Tabellen erstellen:
Code:
Es handelt sich im Grunde also von einer n:n Beziehung zwischen P und PA.
Tabelle Property alias P...... beinhaltet Häuser
Tabelle Partner alias PA...... beinhaltet Mitarbeiter Tabelle KeyHistory alias KH... stellt einen Schlüsselverlauf dar, wann also ein Mitarbeiter den Schlüssel für ein Haus erhalten hat Die Tabelle KH beinhaltet im Groben nur 3 Felder:
Code:
Dürfte klar sein... Property linkt auf den das Haus, Person auf den Partner, und FromDate beinhaltet das Datum, wann der Partner den Schlüssel erhalten hat.
Property
Person FromDate Was ich jetzt erreichen will, ist eine View zu erstellen, die mir eine Liste aller Häuser P gibt, mit dem Namen des Partners, der heute den Schlüssel hat. Ich will also nicht den Schlüsselverlauf, sondern den aktuellen Stand. Mein bisheriger Versuch ist der hier:
SQL-Code:
Das bringt mir aber nichts, da ja der Schlüssel zu unterschiedlichen Personen wandern kann, und ich somit eigentlich nur eine Liste bekomme, wann welche Person den Schlüssek zuletzt hatte. Ich brauch aber nur eine Liste, wer den Schlüssel heute hat.
SELECT P.Nr, PA.Firmname1, MAX(KH.FromDate) AS Datum
FROM KeyHistory KH INNER JOIN Partner PA ON KH.Person = PA.ID INNER JOIN Property P ON KH.Property = P.ID GROUP BY P.Nr, PA.Firmname1 Geht das überhaupt in einem Ruck mit T-SQL ? EDIT: Tags vergessen |
Re: SQL Syntax für Max Problem
Moin,
ich habe deine Struktur noch nicht so ganz verstanden. Versuch doch mal folgendes...
SQL-Code:
Hoffe das hilft dir weiter.
SELECT p.nr, pa.firmname1, kh.fromdate AS Datum
FROM keyhistory kh INNER JOIN partner pa ON kh.person = pa.id INNER JOIN property p ON kh.property = p.id WHERE kh.fromdate = (SELECT MAX(fromdate) FROM keyhistory WHERE person = kh.person AND property = kh.property) GROUP BY p.nr, pa.firmname1 MfG Thorsten |
Re: SQL Syntax für Max Problem
Uii.. Sowas in der Art hatte ich auch schon probiert. Das ist auch schon fast die lösung. Nur, wenn 2 Einträge mit unterschiedlichen Partnern in der KeyHistory stehen (mit gleichem haus), was bringt mir dann deine Lösung? Welchen Partner wird denn da gewählt.
Hatte auch schon was mit ... where kh.ID = (Select max(ID)...), also ähnlich wie Du, nur über den PK anstatt über das Datum zu gehen. Aber dann geh ich wieder klangheimlich davon aus, dazu die grössten Daten auch automatisch die grösste ID haben, dem ist aber nicht so, da eventuell ein Datum nachträglich verändert werden kann. Ich bräuchte im Grunde eine Kombination aus grösstem Datum und, falls es 2 mit dem gleichem Datum gibt, dann den mit der grössten ID. Oder ich muss dafür sorgen, dass die Kombination (Haus,Datum) unique ist.... Ich werd mir das mal die Tage genauer reinziehen. Danke aber für den Tipp. Ich glaub in die Richtung muss ich denken. |
Re: SQL Syntax für Max Problem
Hallo ihr beiden,
ihr seid schon nah dran gewesen:
SQL-Code:
Grüße vom marabu
SELECT P.Nr, PA.Firmname1, KH.FromDate
FROM KeyHistory KH INNER JOIN Partner PA ON KH.Person = PA.ID INNER JOIN Property P ON KH.Property = P.ID WHERE KH.FromDate IN ( SELECT MAX(FromDate) FROM KeyHistory WHERE FromDate <= :today and property = P.ID ) ORDER BY P.Nr |
Re: SQL Syntax für Max Problem
Hallo,
Was damit aber immer noch nicht funktioniert, ist wenn es mehrere Wechsel an einem Tag gab :( |
Re: SQL Syntax für Max Problem
Hallo Union,
was glaubst du passiert, wenn FromDate den SQL-Datentyp DateTime hat und die Variable :today in Delphi mit Now() belegt wird? Freundliche Grüße vom marabu |
Re: SQL Syntax für Max Problem
Dann gibt es natürlich keine derartigen Probleme. Es sei denn die sind sehr schnell bei der Schlüsselübergabe ;) Aber mir ging es auch eher um eine theroretisch immer funktionierende Lösung. Man kann das ja auch abstrahieren um etwas zu formulieren wie "In welches Regal wurde ein Artikel zuletzt gelegt (bzw. gebucht)".
Im konkreten Beispiel kann es aber durch Eingabefehler passieren. Die Schlüsselübergabe erfolgt ja durch Benutzereingabe. Und Benutzer sind generell böse... |
Re: SQL Syntax für Max Problem
Zitat:
Die geben in der Tat nur ein Datum ein, ohne Zeitstempel. Das könnte ich natürlich noch erweitern, daran sollte es nicht scheitern. Ich komme heute nicht mehr dazu, werde morgen aber dann mal Marabu's Vorschlag testen. @marabu: Genau deine Syntax hatte ich auch, ausser dann ich im Subselect anstatt "FromDate <= :today " verglichen habe, ich die ID herangezogen habe, also: "ID = kh.ID". War ich ja nah dran :-) |
Re: SQL Syntax für Max Problem
Moin,
Zitat:
Also so...
SQL-Code:
Was den Vorteil bietet, auf hunderstel genau einen Vergleich durchzuführen. So schnell kann die Schlüsselübergabe dann nicht sein.
SELECT p.nr, pa.firmname1, kh.fromdate
FROM keyhistory kh INNER JOIN partner pa ON kh.person = pa.id INNER JOIN property p ON kh.property = p.id WHERE kh.fromdate IN (SELECT MAX(fromdate) FROM keyhistory WHERE fromdate <= GETDATE() AND property = p.id) ORDER BY p.nr Oder übersehe ich da jetzt was? MfG Thorsten |
Re: SQL Syntax für Max Problem
Zitat:
SQL-Code:
SELECT p.nr, pa.firmname1, kh.fromdate
FROM keyhistory kh INNER JOIN partner pa ON kh.person = pa.id INNER JOIN property p ON kh.property = p.id WHERE kh.fromdate = (SELECT MAX(fromdate) FROM keyhistory WHERE property = p.id) ORDER BY p.nr |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz