Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Wie Update mit max() pro Gruppe (https://www.delphipraxis.net/194211-wie-update-mit-max-pro-gruppe.html)

BlueStarHH 28. Okt 2017 21:14

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:
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
Mein Ansatz:
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?

p80286 28. Okt 2017 21:25

AW: Wie Update mit max() pro Gruppe
 
mach einen zusätzlichen Subselect mit
SQL-Code:
where positionsnr<>999
Gruß
K-H

BlueStarHH 28. Okt 2017 21:27

AW: Wie Update mit max() pro Gruppe
 
Zitat:

Zitat von p80286 (Beitrag 1384434)
mach einen zusätzlichen Subselect mit
SQL-Code:
where positionsnr<>999
Gruß
K-H

Danke, aber irgendwie stehe ich gerade auf dem Schlauch. Poste mal bitte den kompletten SQL-Ausdruck.

Aviator 28. Okt 2017 21:57

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

nahpets 28. Okt 2017 22:17

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? http://www.delphipraxis.net/85745-da...ds-finden.html

Aviator 28. Okt 2017 22:19

AW: Wie Update mit max() pro Gruppe
 
Zitat:

Zitat von nahpets (Beitrag 1384437)
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.

Das ist richtig. Aber das war ja scheinbar auch die Frage. Zumindest wurde das nicht auf bspw. nur die erste 999er ID eingegrenzt. Mir kommt das zwar auch etwas komisch vor, aber es ist zumindest eine Lösung für die aktuell definierte Frage. :-D

nahpets 28. Okt 2017 22:27

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

BlueStarHH 29. Okt 2017 08:00

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.

TigerLilly 29. Okt 2017 09:22

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

nahpets 29. Okt 2017 09:52

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 20:03 Uhr.
Seite 1 von 2  1 2      

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