AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL Syntax für Max Problem
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Syntax für Max Problem

Ein Thema von Jelly · begonnen am 6. Dez 2005 · letzter Beitrag vom 8. Dez 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#1

SQL Syntax für Max Problem

  Alt 6. Dez 2005, 15:57
Datenbank: MSSQL • Version: 2000 • Zugriff über: irrelevant
Tach,

ich möchte eine View über 3 Tabellen erstellen:
Code:
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
Es handelt sich im Grunde also von einer n:n Beziehung zwischen P und PA.
Die Tabelle KH beinhaltet im Groben nur 3 Felder:
Code:
Property
Person
FromDate
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.

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:
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
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.


Geht das überhaupt in einem Ruck mit T-SQL ?

EDIT: Tags vergessen
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: SQL Syntax für Max Problem

  Alt 6. Dez 2005, 22:50
Moin,

ich habe deine Struktur noch nicht so ganz verstanden.

Versuch doch mal folgendes...

SQL-Code:
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
Hoffe das hilft dir weiter.

MfG
Thorsten
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#3

Re: SQL Syntax für Max Problem

  Alt 6. Dez 2005, 23:04
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: SQL Syntax für Max Problem

  Alt 7. Dez 2005, 07:16
Hallo ihr beiden,

ihr seid schon nah dran gewesen:

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 IN (
  SELECT MAX(FromDate)
  FROM KeyHistory
  WHERE FromDate <= :today and property = P.ID
)
ORDER BY P.Nr
Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: SQL Syntax für Max Problem

  Alt 7. Dez 2005, 07:43
Hallo,

Was damit aber immer noch nicht funktioniert, ist wenn es mehrere Wechsel an einem Tag gab
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: SQL Syntax für Max Problem

  Alt 7. Dez 2005, 07:54
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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: SQL Syntax für Max Problem

  Alt 7. Dez 2005, 08:01
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...
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#8

Re: SQL Syntax für Max Problem

  Alt 7. Dez 2005, 08:26
Zitat von Union:
Im konkreten Beispiel kann es aber durch Eingabefehler passieren. Die Schlüsselübergabe erfolgt ja durch Benutzereingabe. Und Benutzer sind generell böse...
Nee, nicht böse, aber sehr erfinderisch

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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: SQL Syntax für Max Problem

  Alt 7. Dez 2005, 20:22
Moin,

Zitat von marabu:
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 IN (
  SELECT MAX(FromDate)
  FROM KeyHistory
  WHERE FromDate <= :today and property = P.ID
)
ORDER BY P.Nr
wenn :today mit Now geladen wird, was spricht dann gegen GETDATE() ?

Also so...

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 IN (SELECT MAX(fromdate)
                      FROM keyhistory
                      WHERE fromdate <= GETDATE()
                        AND property = p.id)
ORDER BY p.nr
Was den Vorteil bietet, auf hunderstel genau einen Vergleich durchzuführen. So schnell kann die Schlüsselübergabe dann nicht sein.

Oder übersehe ich da jetzt was?

MfG
Thorsten
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: SQL Syntax für Max Problem

  Alt 7. Dez 2005, 20:34
Zitat von omata:
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 IN (SELECT MAX(fromdate)
                      FROM keyhistory
                      WHERE fromdate <= GETDATE()
                        AND property = p.id)
ORDER BY p.nr
Was den Vorteil bietet, auf hunderstel genau einen Vergleich durchzuführen. So schnell kann die Schlüsselübergabe dann nicht sein.

Oder übersehe ich da jetzt was?
Ooch, nur das hier: Ich verstehe die Einschränkung 'fromdate <= GetDate()' im Subselect nicht, oder gibt es Schlüsselübergaben, die in der Zukunft liegen?
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
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz