Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Komplizierte Mysql-Abfrage (https://www.delphipraxis.net/179639-komplizierte-mysql-abfrage.html)

LoewenZahn 21. Mär 2014 13:53

Datenbank: Mysql • Version: 2.9 • Zugriff über: Delphi

Komplizierte Mysql-Abfrage
 
Und nun stoße ich an meine Grenzen.

Ich habe ein Problem mit meinem zu bearbeitenden Daten und benötige nun eine Abfrage doch diese scheint weit über meine Kompetenz zu gehen.

Zur Frage warum die Datenbank so aufgebaut ist und warum ich nicht einfach die Struktur verbessere: Die Daten sind schon so vorhanden und sollen nun vom Programm aus aufgeräumt werden.

Also, ich habe eine Datenmenge/Archiv mit Artikeln. Dort sind Artikel mit einer Bestellanzahl enthalten, nun gibt es aber zu einer Menge Rueckstände, daher will ich die Tabelle aufräumen:

Code:
+-----------+------------+--------+------------+    +-----------+------------+--------+------------+ 
| Archiv_id | Artikel_id | Anzahl | Rueckstand |    | Archiv_id | Artikel_id | Anzahl | Rueckstand |
+-----------+------------+--------+------------+    +-----------+------------+--------+------------+
|     0     |    101     |   1    |     4      |    |     0     |    101     |   0    |     0      |
|     1     |    101     |   2    |     0      |    |     1     |    101     |   0    |     0      |
|     2     |    101     |   2    |     0      | -> |     2     |    101     |   1    |     0      |
|     3     |    103     |   1    |     0      |    |     3     |    103     |   1    |     0      |
|     4     |    104     |   1    |     2      |    |     4     |    104     |   0    |     0      |
|     5     |    104     |   2    |     0      |    |     5     |    104     |   1    |     0      |
+-----------+------------+--------+------------+    +-----------+------------+--------+------------+
Was ist passiert? Es wurde ein Rueckstand zu einer Artikel_id betrachtet, folglich wurden solange Anzahlen zu diesem Artikel abgezogen, bis der Rueckstand eleminiert ist. Der Rest bleibt stehen.

Wie könnte man dies am besten via Mysql realisieren?

Mein eigener Ansatz bestand darin, dass ich ...
1. für jeden Artikel mit Rueckstand die Datensätze durchgehe. Also einmal alle mir 101 und einmal alle mit 104.
2. Dann vll die Summe(Anzahl) - Rueckstand
3. Alle Datensätze mit Anzahl auf 0
4. Einen einzelnen Datensatz mit Anzahl auf das Ergebnis von Punkt 2.

Das muss doch einfacher gehen? Ungern würde ich dutzende von Mysqlbefehlen nutzen sondern lieber einen einzigen.


Dann mal los :( eventuell gibts ja eine einfache Methodik oder Funktion die sich hier super anwenden lässt, mir allerdings noch unbekannt ist.

Gruß

mkinzler 21. Mär 2014 14:15

AW: Komplizierte Mysql-Abfrage
 
Ist es egal, welche Bestand mit Anzahl bleibt?

p80286 21. Mär 2014 14:45

AW: Komplizierte Mysql-Abfrage
 
Also wenn die Archiv_id letztlich egal ist,
dann würde ich es mal so versuchen
Code:
select artikel_id, sum(Anzahl),sum(Rueckstand),sum(Anzahl)-sum(Rueckstand)
from ...
group by Artikel_id
Gruß
K-H

DeddyH 21. Mär 2014 14:48

AW: Komplizierte Mysql-Abfrage
 
Wenn ich es richtig verstanden habe, will er mehrere Datensätze bearbeiten und den Rückstand darauf verteilen -> Rückstandsausgleich. Ich wüsste aber nicht, wie man das mit einem einzigen Statement bewerkstelligen soll, es sei denn, man schreibt sich eine SP und ruft die dann auf.

p80286 21. Mär 2014 14:52

AW: Komplizierte Mysql-Abfrage
 
Ich denke nicht:
Zitat:

1. für jeden Artikel mit Rueckstand die Datensätze durchgehe. Also einmal alle mir 101 und einmal alle mit 104.
2. Dann vll die Summe(Anzahl) - Rueckstand
Aber vllt. habe ich da etwas falsch verstanden.

Gruß
K-H

jobo 21. Mär 2014 14:55

AW: Komplizierte Mysql-Abfrage
 
Ich glaube das geht nicht mit einem Befehl der alle Fälle abdeckt.
Sobald die Anzahl eines Satzes upgedated werden muss, dessen Rückstand in einem anderen Satz zu korrigieren ist, brauchst Du 2 Updates.

Ich denke, es spricht nichts gegen einen Cursor der das durcharbeitet oder? So viele Befehle werden es nicht.

Oder aber Fall-Analyse und je Fall ein Update Statement.

Blup 21. Mär 2014 14:58

AW: Komplizierte Mysql-Abfrage
 
Mit einem kleine Sript geht es vieleicht, mal so aus dem Stand:
Code:
ALTER TABLE T_ARTIKEL ADD TEMP INTEGER;

update tabelle a
set   a.temp = (select sum(b.rueckstand) from tabelle b where (b.artikel_id = a.artikel_id))
               -(select sum(c.anzahl)    from tabelle c where (c.artikel_id = a.artikel_id) and (c.archiv_id < a.archiv_id));

update tabelle
set   anzahl = 0,
       temp  = 0
where (temp > anzahl);

update tabelle
set   anzahl = anzahl - temp,
       temp  = 0
where (temp > 0);

Furtbichler 22. Mär 2014 09:47

AW: Komplizierte Mysql-Abfrage
 
Und dann die Spalte wieder entfernen ;-)

Im Grunde genommen läuft es darauf hinaus, pro Artikel nur eine Zeile zu behalten und den Rest zu nullen.

In T-SQL (MS-SQL) würde das so gehen (Überarbeitung der Artikel-Tabelle anhand einer Arbeitsgrundlage). Ob das so in MySQL geht, weiß ich nicht.

Desweiteren müsste man noch klären, was passiert, wenn der Rückstand > Artikel ist.
Code:
update T_Artikel
   set Anzahl = case when x.RefID=Archiv_ID then x.Anzahl - x.Rückstand else 0 end,
       Rückstand = 0
from (
  select Artikel_ID,
         max(Archiv_ID) as RefID,
         sum(Anzahl) as Anzahl,
         Sum(Rückstand) as Rückstand
    from T_Artikel
   group by Artikel_ID
  ) x


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:47 Uhr.

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