# nur das aktuellste Datum ausgeben lassen



## AlexD1979 (30. August 2004)

Hallo,
Ich  habe einen SQL, der mir eine Liste von Inventarnummern zurückliefert.
Zu jedem Datensatz gibt es teilweise mehrfache Installationsorte, die jeweils immer mit einem Datum in der Datenbank vermerkt sind.
Nun möchte ich meine Datenbankausgabe so umstellen, dass er mir nur noch die Datensätze mit dem aktuellsten Datum ausgibt. Geht sowas? Das ist eine MS SQL 2000 Datenbank

SELECT BESTAND.RHW_NR, STANDORT.K_STELL, BESTAND.TYP, STANDORT.INSTALL
FROM BESTAND INNER JOIN STANDORT ON BESTAND.RHW_NR = STANDORT.RHW_NR
WHERE ((BESTAND.RHW_NR=STANDORT.RHW_NR) AND (STANDORT.K_STELL="" Or STANDORT.K_STELL="963500") AND (BESTAND.TYP=3 Or BESTAND.TYP=10) AND (BESTAND.SCHROTT="N"))
ORDER BY BESTAND.RHW_NR, STANDORT.INSTALL DESC , STANDORT.K_STELL, BESTAND.TYP;

STANDORT_INSTALL ist das Datumsfeld, welches im Format dd.mm.yyyy die Infos enthält. Es kann also zu jedem Bestand.RHW_NR mehrere  Einträge STANDORT.RHW_NR geben mit unterschiedlichen Datumsangaben.

Ich hoffe ich habe das verständlich umschrieben und es kann mir jmd helfen.


----------



## Radhad (30. August 2004)

Wie wäre es damit: du sortierst die Einträge nach dem Datum mit DESC, zählst die Einträge, und liest den Letzten aus. Das wäre das neueste Datum. Sollte das Datum mehrmals vorkommen, dann liest du halt alle mit dem Datum aus. Das ganze noch per Subquery und es müsste gehen.


MfG Radhad


----------



## AlexD1979 (30. August 2004)

Hi
Ich gebe die Daten bereits sortiert aus ("STANDORT_INSTALL DESC"). Allerdings den letzten auslesen verstehe ich nicht so richtig. Das ist eine Liste mit 500 Datensätzen, einige kommen 2x,3x,10x vor, je nachdem, wie viele Datumseinträge vorliegen.
Subquery? Verstehe ich nicht... Kannst du das bitte ein wenig erläutern.
Danke


----------



## Radhad (30. August 2004)

Du kannst auch anch 2 Kriterien Sortieren. Ein Subquery ist eine Unterabfrage, und sieht folgendermaßen aus:


```
SELECT ort
FROM Users
WHERE ort = (SELECT ort FROM städteliste WHERE ort LIKE 'm%');
```

Wenn du das letzte Datum mit einer Subquery rausholst, kannst du dir auch alle Einträge anzeigen lassen, die gleich diesem Datum sind.  Also grob:


```
SELECT *
FROM tbl1
WHERE Eintrag1 = Bedingung1
AND date = (SELECT date DESC FROM tbl1 ORDER BY date);
```

Ich weiß jetzt nicht ob er dann alle Zeilen zurückgibt oder nur die erste. Wenn es nur die 1. Zeile ist (und damit das letzte Datum) sollte das so funktionieren. Musst es nur auf deine Abfrage erweitern.


MfG Radhad


----------



## Gorcky (31. August 2004)

Müsste auch so gehen:

```
SELECT inventarnr, ort, datum
FROM installation 
WHERE datum=MAX(datum) 
GROUP BY inventarnr
```


----------



## AlexD1979 (2. September 2004)

Soweit habe ich es nun hinbekommen. allerdings noch in 2 Abfragen, das muss ich irgendwie in eine bekommen und das klappt noch nicht so wirklich...
Hier der erste SQL:

Tabelle BESTAND
SELECT	RHW_NR
	FROM	Bestand
	WHERE	Schrott = 'N'
	AND Typ = #typ_laptop#
	AND k_stelle = '#kst.kostenstelle#'

Dieser SQL war bisher gültig. Aus der einen Tabelle Bestand habe ich alle Daten bekommen. Nun muss ich aber auf eine zweite Tabelle zugreifen.
Ich brauche also die Kostenstelle aus dem 2. SQL  mit den Bedingungen des ersten SQL

Tabelle STANDORT
SELECT b.RHW_NR 
FROM STANDORT b,
                      (select rhw_nr,max(install) as mi from standort a  
                       group by rhw_nr) a
where a.rhw_nr=b.rhw_nr 
and a.mi=b.install

Irgendwie muss ich nun diese zwei SQLs zu einem vereinen, wie nur soll das gehen?  Ich brauche also aus dem ersten SQL zusätzlich die Angaben Schrott und TYP


----------



## Radhad (2. September 2004)

Ist "standort" eine Tabelle? Wenn ja dann benutz lieber ein JOIN-Statement

An die Funktion MAX() hatte ich garnicht mehr gedacht ;-)


MfG Radhad


----------



## Gorcky (2. September 2004)

Also Du willst den maximalen Wert zu jeder RHW_NR ausgegeben bekommen, oder ? - Zumindest sieht das bei deiner Abfrage so aus.    
Du möchtest aber noch eine Spalte STANDORT.K_STELL ausgeben.
Da Du diese Spalte mit in GROUP BY reingenommen hast, gruppiert er erst in Gruppen nach RHW_NR *und danach in Untergruppen nach STANDORT.K_STELL*.
Von jeder dieser Untergruppen sucht er jetzt den größten Wert und gibz ihn aus.
Du dürftest also "nur" alle Datensätze (mit MAX-Wert) augegeben bekommen, die nicht die gleiche RHW_NR *und* STANDORT.K_STELL haben, bzw. diese nur einmal.  

Du willst aber nur nach RHW_NR gruppieren - dazu müsstest Du also folglich STANDORT.K_STELL aus dem GROUP BY 'rauslassen. Das geht aber so nicht !
Bei deiner Abfrage würde nämlich folgendes passieren:
1.Die Datenbank sucht nach dem Größten Wert für diese Gruppe und merkt sich diesen, _*aber nicht den Datensatz!*_
2. Die Datenbank möchte jetzt einen Wert für STANDORT.K_STELL ausgeben, weiß aber nicht welchen, da dafür in der Gruppe unterschiedliche Werte existieren (können).

Daher lässt eine DB so etwas gar nicht erst zu.

Ich habe folglich mein MAX() ganz bewusst in eine WHERE-Klausel gesteckt, da er jetzt nach dem Datensatz mit dem Größten Wert sucht, nicht nur den größten Wert selbst.

*puh* Verstanden?


----------



## AlexD1979 (2. September 2004)

Hi Gorcky,
Während du deinen langen Eintrag geschrieben hast, habe ich auch schon was gepostet. (siehe 2 Threads weiter oben).
Es klappt nun so schon, wenn ich es in zwei SQLs mache. Ich muss nun diese SQLs zu einem vereinen... ich bekomm noch nen Fön !

Stimmt deine Beschreibung trifft zu. Rein Logisch muss ich erst in einem Select mir das größte Datum zu einem Datum suchen und in einem zweiten Select die passende Kostenstelle zu dem Kriterium RHW_NR und Datum.

Schau dir bitte mal meinen SQL weiter oben an und deine Meinung ?


----------



## Gorcky (2. September 2004)

Mit UNION kannst du zwei (Ergebnis-)Tabellen zu einer zusammenfügen.

SELECT [...]
UNION
SELECT [...]


----------



## Radhad (3. September 2004)

Die UNION Funktion wird nocht von MS SQL Server 2000 unterstützt, wenn du den benutzen solltest. Daran bin ich auch schonmal verzweifelt.


MfG Radhad


----------

