zeilen nummerieren

T

taqwa

Guest
hallo

ms sql server 2000 oder 2005

bin kurz vor der verzweiflung. habe eine tabelle mit dem feld position,
die folgender massen ausschaut. im feld position muss ich die anzahl
der auftragspositionen schreiben, siehe untere tabellen. also wenn
ein neuer auftrag beginnt wieder mit 1,2,3 ,4 weitermachen. hat mir jemand
ein script, danke alexander

tabelle vor dem schreiben

ordnr Position article_id
700069 0 06999
700069 0 06991
700069 0 06995
700069 0 06555
700069 0 06344
700070 0 06222
700071 0 06922
700072 0 06999
700073 0 06985
700073 0 06964


tabelle nach dem schreiben

ordnr Position article_id
700069 1 06999
700069 2 06991
700069 3 06995
700069 4 06555
700069 5 06344
700070 1 06222
700071 1 06922
700072 1 06999
700073 1 06985
700073 2 06964
 
Es gibt zwei Varianten:

1. Schreibe einen Trigger, der beim Speichern eines Datensatzes prüft (simples Count(*)), ob es bereits Einträge zu derselben ordnr gibt. Der neue Wert ist dann Count(*) + 1.

2. Speichere das gar nicht, sondern ergänze das erst beim Auslesen. Dummerweise geht das beim MS-SqlServer 2000 nicht so elegant, man müßte die IDs in eine temporäre Tabelle mit AutoIncrement speichern, um die Zeilenposition zu kriegen. Im Sql-2005 läßt sich das mit row_number() Over (Order By Spaltenname) elegant lösen.
 
So, inzwischen hat sich herausgestellt, daß per Select die leere Tabelle komplett gefüllt wird.

Damit ist ein Trigger nicht mehr sinnvoll - der oben angedachte Trigger geht von einer Einzelzeileneinfügung aus. Und ein row_number() Over (Order By Spalte) scheidet auch aus, weil verschiedene ordnr gemeinsam behandelt werden, die Zählung soll ja immer bei 1 neu beginnen.

Trotzdem ist das Problem mit einer einzigen zusätzlichen Update-Anweisung lösbar:

Prinzip: Die ordnr-Spalte liefert das Zählkriterium. Gibt es drei Zeilen mit demselben ordnr-Wert, dann soll die erste davon mit 1, die zweite mit 2 und die dritte mit 3 aktualisiert werden.

Das klappt über eine Selbstverknüpfung der Tabelle über sich selbst, über die dann aggregiert wird. ID sei der Primärschlüssel der Tabelle:

CODE Select A.ID, A.ordnr, Count(*) As Anzahl
From Tabelle As A Inner Join Tabelle As B
On A.ordnr = B.ordnr And A.ID >= B.ID
Group By A.ID, A.ordnr


Jeder Datensatz wird einmal sich selbst zugeordnet (damit Count(*) >= 1), dann werden noch alle IDs zur gleichen ordnr gesucht, die größer sind. Das zählt also einfach zu jeder ID die Zahl der Datensätze mit gleicher ordnr und größergleicher ID.

Der Rest dürfte klar sein - das obige in eine Unterabfrage und damit aktualisieren:


CODE Update Tabelle
Set Position = C.Anzahl
From Tabelle As A Inner Join
(Select A.ID, A.ordnr, Count(*) As Anzahl
From Tabelle As A Inner Join Tabelle As B
On A.ordnr = B.ordnr And A.ID >= B.ID
Group By A.ID, A.ordnr) As C
On A.ID = C.ID


Da die Fragestellung von allgemeinem Interesse ist, macht es auch Sinn, das hier reinzuschreiben.
 
Zurück
Oben