AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Komplizierte Mysql-Abfrage

Ein Thema von LoewenZahn · begonnen am 21. Mär 2014 · letzter Beitrag vom 22. Mär 2014
Antwort Antwort
Benutzerbild von LoewenZahn
LoewenZahn

Registriert seit: 10. Okt 2013
22 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Komplizierte Mysql-Abfrage

  Alt 21. Mär 2014, 14:53
Datenbank: Mysql • Version: 2.9 • Zugriff über: Delphi
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ß
Tim
Passwörter sind wie Unterwäsche. Du darfst sie keinen sehen lassen, musst sie regelmäßig wechseln und solltest sie nicht mit Fremden tauschen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Komplizierte Mysql-Abfrage

  Alt 21. Mär 2014, 15:15
Ist es egal, welche Bestand mit Anzahl bleibt?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Komplizierte Mysql-Abfrage

  Alt 21. Mär 2014, 15:45
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#4

AW: Komplizierte Mysql-Abfrage

  Alt 21. Mär 2014, 15:48
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Komplizierte Mysql-Abfrage

  Alt 21. Mär 2014, 15:52
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Komplizierte Mysql-Abfrage

  Alt 21. Mär 2014, 15:55
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#7

AW: Komplizierte Mysql-Abfrage

  Alt 21. Mär 2014, 15:58
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);
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#8

AW: Komplizierte Mysql-Abfrage

  Alt 22. Mär 2014, 10:47
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
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:32 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