![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC
Wie Update mit max() pro Gruppe
Hallo,
ich habe eine Tabelle RechnungPos mit RechnungsNr und PositionsNr. Die PositionsNr gibt die Reihenfolge von Artikeln auf einer Rechnung an. *Einige* Rechnungen enthalten die Postion 999, die per SQL in die nächste freie PositionsNr < 999 geändert werden soll. So soll das aussehen:
Code:
Mein Ansatz:
RechnungNr PositionsNr
1 1 1 2 1 999 wird zu 3 2 1 2 2 2 3 2 999 wird zu 4 3 999 wird zu 1 4 1 4 2 update RechnungPos set PositionsNr max(PositionsNr)+1 where PositionsNr 999 Problem dabei ist max(PositionsNr) wird die 999 zurückgeben und wie kann man das pro RechnungNr setzen/abfragen? |
AW: Wie Update mit max() pro Gruppe
mach einen zusätzlichen Subselect mit
SQL-Code:
Gruß
where positionsnr<>999
K-H |
AW: Wie Update mit max() pro Gruppe
Zitat:
|
AW: Wie Update mit max() pro Gruppe
Könnte so funktionieren wenn man es wie von p80286 vorgeschlagen mit einem Subselect macht.
SQL-Code:
UPDATE RechnungPos
SET PositionsNr = MAX(SELECT PositionNr FROM RechnungPos WHERE PositionNr <> 999) + 1 WHERE PositionsNr = 999 |
AW: Wie Update mit max() pro Gruppe
Das setzt aber alle PositionsNr, die 999 sind, auf die höchste freie PositionsNr <> 999. Damit käme die 999 nicht mehr vor, aber die (Max <> 999) + 1, genauso oft, wie bisher die 999.
Man müsste die Tabelle satzweise durchgehen und für jeden Satz, dessen PositionsNr = 999 ist, per Update aktuallisieren. Dabei ist Max auf die PositionsNr aber nicht die nächste freie, sondern die höchste vergebene. Lücken kann man damit nicht finden. 'ne Lösung hab' ich nicht, aber eventuell hilft dashier weiter? ![]() |
AW: Wie Update mit max() pro Gruppe
Zitat:
|
AW: Wie Update mit max() pro Gruppe
Ausgehend von der Beispieltabelle, soll je RechnungsNr die kleinste freie PosititionsNr für die 999 vergeben werden.
Ungefähr sowas: Suche für jede RechnungsNr jede PositionsNr = 999 und gebe ihr die kleinste freie PositionsNr zu diese RechnungsNr |
AW: Wie Update mit max() pro Gruppe
Sorry, es war gestern wohl schon zu spät für mich und ich habe einen Teil der Anforderungen verschluckt:
Es soll die nächste "freie" PositionsNr je RechnungNr anstelle der 999 eingetragen werden. Man sieht es an der Beispieltabelle, die ich in der Frage gepostet habe. |
AW: Wie Update mit max() pro Gruppe
UPDATE RechnungPos
SET PositionsNr = (SELECT max(PositionNr)+1 FROM RechnungPos p WHERE PositionNr <> 999 and p.rechnungsnummer=rechnungspos.rechnungsnummer) WHERE PositionsNr = 999 |
AW: Wie Update mit max() pro Gruppe
Das geht aber schief, wenn es mehr als eine PositionsNr = 999 zu einer RechnungsNr gibt, die bekommen dann alle die Max(PositionNr)+1. Man erhält dann Dubletten, die ggfls. nicht mehr so leicht zu erkennen sind, wie die 999.
Mir fällt momentan keine Lösungsmöglichkeit mit einem einzigen Updatestatement ein. Da muss man wohl mit 'nem Cursor über alle Sätze mit PositionsNr = 999 ran und die einzeln ändern. Ohne einen eindeutigen Schlüssel für jeden Datensatz, kann man (glaub' ich) die Entstehung von Dubletten nicht vermeiden, sofern die Kombination aus RechnungsNr und PositionsNr = 999 nicht eindeutig ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:04 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