SQL Update mit Werten aus gleicher Tabelle (Access 2003)

fischilein2

Grünschnabel
Hallo,

ich habe folgendes Problem: In einer Tabelle "Konto" (Access 2003) habe ich Datensätze zu den gleichen Konten aber aus unterschiedlichen Geschäftsjahren, z.B.

id / Konto / Geschäftsjahr / ....
1 / 3 / 2010 / .....
2 / 4 / 2010 / ....
3 / 3 / 2009 / ....
...
Ich muss jetzt per SQL in einem neuen Feld "Vorjahres-ID" die ID des alten Jahres wegspeichern. Also für Konto 3 im Jahr 2010 (id=1) soll in einem Feld VJ_ID der Wert 3 gespeichert werden (die ID der letzten Zeile im Bsp.). Wenn es keine Vorjahresdaten gibt, dann bleibt es standardmäßig auf 0.

Weiß jemand wie das geht? Ich habe schon versucht die Tabelle mit sich selbst zu verknüpfen aber immer nur Fehler bekommen. im Augenblick mache ich es über DLookUp für jeden Datensatz einzeln, aber dass dauert zu lange.

Viele Grüße
fischilein
 
Wenn das Geschäftsjahr als Zahl gespeichert ist, kannst du es so lösen
SQL:
SELECT 
	this_year.id, 
	this_year.Konto, 
	this_year.Geschäftsjahr, 
	last_year.id AS last_year_id
FROM 
	Konto AS this_year,
	Konto AS last_year
WHERE 
	this_year.Konto = last_year.Konto
	AND (this_year.Geschäftsjahr-1) = last_year.Geschäftsjahr;
 
Zuletzt bearbeitet von einem Moderator:
Hallo yaslaw,

danke für die Antwort! im Grunde habe ich es auch hinbekommen, aber ich habe jetzt das Problem, dass ich ein feste Abfrage habe. Ich würde das Ganze gerne in einem SQL unterbringen.
Ich habe den SQL von Dir in einer Abfrage1 gespeichert und dann führe ich darauf folgenden SQL aus:

UPDATE Konto INNER JOIN Abfrage1 ON Konto.ID = Abfrage1.id
SET Konto.VJID = [Abfrage1]![last_year_id];


Kann ich das nicht als einen einzigen SQL ausführen? Dafür bin ich wahrscheinlich zu ....

Vielen Dank
fischilein
 
etwa so
SQL:
UPDATE 
	Konto AS this_year, 
	Konto AS last_year 
SET 
	this_year.vjid = last_year.Geschäftsjahr
WHERE 
	this_year.Konto=last_year.Konto 
	AND (this_year.Geschäftsjahr-1)= last_year.Geschäftsjahr;
 
Zuletzt bearbeitet von einem Moderator:
Hallo,
ich habe eine Frage zu dem Update (was wirklich eine sehr gute Lösung ist):
Wie kann ich es anstellen, wenn die Liste zwar so sortiert ist, aber es zum Beispiel in einem Jahr kein Eintrag gibt aber ein Jahr davor?
à la:
id / Konto / Geschäftsjahr / ....
1 / 3 / 2010 / .....
2 / 4 / 2010 / ....
3 / 4 / 2009 / ....
4 / 3 / 2008 / ....

Mit einfach nur nem kleiner hat es nicht funktioniert :(
 
Hi,

ich habe eine ähnliche Liste, bei der es aber leider vorkommen kann, dass die Zahlen nicht unbedingt immer um eins steigen sondern vielleicht auch mal Lücken aufweisen (also habe z.B. 1, 2, 3,.., aber vielleicht auch mal 1, 3, 4,...) ich will in den Datensatz den immer nächsthöheren einsetzten.

Hoffe ich habe jetzt nicht zu wirr gesprochen.
 
Hallo,

mit MS Access 2007

Daten: Tabelle 1
Code:
ID        Value
1          A                                                                                                                                                                                                                                                              
3          B                                                                                                                                                                                                                                                              
4          C                                                                                                                                                                                                                                                              
7          D                                                                                                                                                                                                                                                              
8          E

Abfrage:
SQL:
select x.id, max(x.prev_id) as max_prev_id from (
   SELECT a.id, b.id as prev_id FROM Tabelle1 a left join tabelle1 b on  a.id > b.id
) x group by x.id 

... oder einfacher:

SELECT a.id, max(b.id) as prev_id FROM Tabelle1 a left join tabelle1 b on  a.id > b.id group by a.id

Ausgabe:
Code:
id	max_prev_id
1	null
3	1
4	3
7	4
8	7

Gruß Tom
 
Vielen Dank für deine Antwort ich hatte mir schon gedacht, dass es so geht habs aber leider selbst nicht hinbekommen, hat mir sehr weitergeholfen. Vielen Dank!
 
Zurück