![]() |
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 |
Re: SQL Syntax für Max Problem
Ich schrieb schon weiter oben, dass der Vergleich mit getdate() OK wäre, wenn denn im fromdate auch die Zeit mit angegeben wäre. Zur Zeit wird das Datum per Hand eingegeben, ohne Zeitangabe. Aber wie gesagt, das kann ich im bestehenden System ohne Weiteres ändern, da dieses ganze Schlüsselmodul neu aufgebaut wird. Wenn einer eine Idee hat, wie man diese Verknüpfungen zwischen Häusern, Partnern und Verlauf besser lösen kann, so bin ich offen für Vorschläge.
Es kann mir auch blühen, dass ich nicht nur eine Liste brauche, wer heute den Schlüssel hat, sondern auch eventuell wer den Schlüssel vor 4 Wochen hatte... Vielleicht sollte ich ein zusätzliches Flag einbauen, und dieses immer nur für den letzten Eintrag auf 1 setze, für alle anderen auf 0. Dies wär problemlos über Trigger zu lösen. Wär das eventuell ein Ansatz? |
Re: SQL Syntax für Max Problem
Hallo Jelly,
ich würde das als Buchungsdatei lösen. Wenn jemand einen Schlüssel erhält, dann Eintrag +1, wenn er ihn abgibt -1. So kannst Du zu es dann zu jedem Zeitpunkt feststellen. |
Re: SQL Syntax für Max Problem
Kannst Du das näher erläutern. Ich versteh nicht ganz was Du meinst. Wenn ich dich richtig verstehe, soll ich nur festhalten, wer wann den Schlüssel kriegt, sondern auch wann er ihn an einen anderen Partner abgibt.
|
Re: SQL Syntax für Max Problem
Ja, genau. Du erzeugst praktisch eine "Umbuchung" der Menge eines Schlüssels von einer Person auf die andere. Das hätte ME auch den Vorteil, dass man auch die Schlüsselabgabe erfassen könnte. Beispiel: Makler gibt Handwerker Schlüssel, Handwerker gibt Schlüssel an Makler zurück, Makler gibt Schlüssel an Mieter.
Code:
mit einer SUM Operation und Having = 1 kannst Du dann zu jedem Zeitpunkt feststellen, wer was hatte (oder wenn Du nicht SchluesselID sondern SchlossID verwendest, wieviele).
PersID, VorgangId, SchluesselID, Datum, Menge
Makler , 1 ,1, 01.12.2005, +1 Makler , 2 ,1, 01.12.2005, -1 Handwerker, 2 ,1, 02.12.2005, +1 Handwerker, 3, 1, 02.12.2005, -1 Meiter , 3, 1, 02.12.2005, +1 |
Re: SQL Syntax für Max Problem
ok, verstanden. Aber was ändert das an meiner View, die ich erstellen möchte ?
Ich kann jetzt hier leider nix testen, aber morgen auf der Arbeit werd ich mich mal näher damit beschäftigen... |
Re: SQL Syntax für Max Problem
![]() Wenn ich das aber mit der Zeit einschränke, oder sogar auf Tabellenebene einen Unique auf (Property,FromDate) setzen würde, ist das Problem gelöst. Danke an alle |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:54 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