AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Kompliziertes Update Statement
Thema durchsuchen
Ansicht
Themen-Optionen

Kompliziertes Update Statement

Ein Thema von mika · begonnen am 15. Mai 2012 · letzter Beitrag vom 16. Mai 2012
Antwort Antwort
Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#1

Kompliziertes Update Statement

  Alt 15. Mai 2012, 12:02
Datenbank: ADS • Version: 9 • Zugriff über: ADS Komponenten, SQL
Hallo Forum,

ich hoffe dass ihr mir eventuell etwas auf die Sprünge helfen könnt. Kurz zu meinem Problem, ich muss eine Lagerumsatzgeschwindigkeit berechnen. Soweit nicht so wild. Meine Tabelle enthält allerdings pro Geschäftsjahr ca 70k Datensätze, weswegen ich nicht jeden einzeln bearbeiten möchte. Das würde Stunden dauern. Die Formel ist recht einfach und ich hab gehofft das ganze in einem SQL unterbringen zu können.

Meine Tabelle sieht im groben so aus
Code:
Jahr: Integer
Monat: Integer
Kunde: Integer
Artikel: Integer
Col: String
AbverkauftMenge: CurDouble
IstBestand: CurDouble
LUG: CurDouble
Die LUG soll so berechnet werden:

LUG = (Summe(AbverkauftMenge) der letzten 12 Monate) / (Summe(IstBestand) der letzten 13 Monate) * 13

Jetzt habe ich gehofft dass ich mit einem Statement der folgenden Art das ganze einfach dem DB-Server überlassen könnte:
Code:
UPDATE
  Statistik
SET
  LUG =
  ( 
    SELECT
      SUM(AbverkauftMenge) AS Menge
    FROM
      Statistik
    WHERE
     Kunde = Statistik.Kunde
     AND Artikel = Statistik.Artikel
     AND Col = Statistik.Col
      AND ((Jahr >= Statistik.Jahr-1 AND Monat >= Statistik.Monat+1)
     OR (Jahr <= Statistik.Jahr AND Monat <= Statistik.Monat))
  )
  / 
  ( 
    SELECT
      SUM(IstBestand) AS Menge
    FROM
      Statistik
    WHERE
     Kunde = Statistik.Kunde
     AND Artikel = Statistik.Artikel
     AND Col = Statistik.Col
      AND ((Jahr >= Statistik.Jahr-1 AND Monat >= Statistik.Monat)
     OR (Jahr <= Statistik.Jahr AND Monat <= Statistik.Monat))
  )
  * 13
Jedoch kommen bei diesem Statement für alle Datensätze der gleiche Wert in jeder Zelle raus. Ich denke das die Kunde/Artikel/Col Where-Klausel nur ein einziger Wert genommen wird...

Vielleicht ist hier ja n DB Profi der mir da n bisschen auf die Sprünge helfen kann, Danke schonmal im voraus!

Lg, Mika

// Edit: Gelöst: Danke für eure Hilfe !
:: don't Panic ::

Geändert von mika (16. Mai 2012 um 10:13 Uhr) Grund: solved
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Kompliziertes Update Statement

  Alt 15. Mai 2012, 12:12
Hallo,

Du solltest/musst entweder den Statistik-Tabellen in den Sub-Selects oder der Statistik-Tabelle im Update einen Alias geben. Sonst macht der da nur Unsinn!

SQL-Code:
UPDATE
  Statistik
SET
  LUG =
  (
    SELECT
      SUM(AbverkauftMenge) AS Menge
    FROM
      Statistik as st1
    WHERE
     st1.Kunde = Statistik.Kunde
     AND st1-Artikel = Statistik.Artikel
     AND st1.Col = Statistik.Col
      AND ((st1.Jahr >= Statistik.Jahr-1 AND st1.Monat >= Statistik.Monat+1)
     OR (st1.Jahr <= Statistik.Jahr AND st1.Monat <= Statistik.Monat))
  )
  /
  (
    SELECT
      SUM(IstBestand) AS Menge
    FROM
      Statistik as st2
    WHERE
     st2.Kunde = Statistik.Kunde
     AND st2.Artikel = Statistik.Artikel
     AND st2.Col = Statistik.Col
      AND ((st2.Jahr >= Statistik.Jahr-1 AND st2.Monat >= Statistik.Monat)
     OR (st2.Jahr <= Statistik.Jahr AND st2.Monat <= Statistik.Monat))
  )
  * 13
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#3

AW: Kompliziertes Update Statement

  Alt 15. Mai 2012, 12:13
okai, danke für den tipp, ich probier das mal schnell aus...
:: don't Panic ::
  Mit Zitat antworten Zitat
Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#4

AW: Kompliziertes Update Statement

  Alt 15. Mai 2012, 12:16
Okai, scheint was anderes zu machen, jetzt kommt aber mein zweites Problem (was ich auch schon befürchtet habe):

Wenn keine Daten für den 2ten Subselect vohanden sind bekomme ich eine Division by Zero Fehlermeldung
:: don't Panic ::
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Kompliziertes Update Statement

  Alt 15. Mai 2012, 12:21
dann mach ein coalesce (falls in ADO vorhanden) oder eben ein iif vor das 2. Select und reagier entsprechend darauf.

Oder sowas:

iif(2. Select is null, 0, 1. Select / 2. Select * 13)

Auch wenns ziemlich unübersichtlich wird
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Kompliziertes Update Statement

  Alt 15. Mai 2012, 12:23
Die Abfrage des Datums-Bereichs funktioniert so aber nicht:
((st1.Jahr >= Statistik.Jahr-1 AND st1.Monat >= Statistik.Monat+1) Nehmen wir mal an
Code:
Statistik.Jahr = 2009
Statistik.Monat = 3
dann werden folgende Daten genommen
Code:
2008 4-12
2009 4-12
2010 4-12
2011 4-12
2012 4-12
* weiter geht es gottlob nicht, denn dann geht ja die Welt unter :o) *
und jetzt noch die Verschlimmbesserung mit
OR (st1.Jahr <= Statistik.Jahr AND st1.Monat <= Statistik.Monat) dann kommt noch hinzu
Code:
anno tuck 1-3
...
2003 1-3
2004 1-3
2005 1-3
2006 1-3
2007 1-3
2008 1-3
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Kompliziertes Update Statement

  Alt 15. Mai 2012, 12:25
Vielleicht noch etwas kürzer...
SQL-Code:
UPDATE
  Statistik
SET
  LUG =
  (
    SELECT
      SUM(AbverkauftMenge) / SUM(IstBestand) * 13
    FROM
      Statistik x
    WHERE Kunde = Statistik.Kunde
      AND Artikel = Statistik.Artikel
      AND Col = Statistik.Col
      AND ( (Jahr >= Statistik.Jahr-1 AND Monat >= Statistik.Monat+1)
           OR (Jahr <= Statistik.Jahr AND Monat <= Statistik.Monat))
  )
  Mit Zitat antworten Zitat
Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#8

AW: Kompliziertes Update Statement

  Alt 15. Mai 2012, 12:26
@SirRufo
Ja, ich denke das OR ist da falsch am Platz. Allerdings sollte es, wenn ich es durch ein AND ersetze, deie richtigen Daten filtern

@General
Ich probier das mal aus, ob es unübersichtilich wird ist nicht sooo wichtig Hauptsache es funktioniert

//edit
@omata
das wird glaub ich leider nicht gehen, da die abverkaufte menge der letzten 12 monate, und der istbestand der letzten 13 monate genommen werden soll
:: don't Panic ::

Geändert von mika (15. Mai 2012 um 12:30 Uhr)
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: Kompliziertes Update Statement

  Alt 15. Mai 2012, 14:05
@omata
das wird glaub ich leider nicht gehen, da die abverkaufte menge der letzten 12 monate, und der istbestand der letzten 13 monate genommen werden soll
Oh, das +1 hatte ich nicht gesehen.

Ok, dann vielleicht so...
SQL-Code:
UPDATE
  Statistik
SET
  LUG =
  (
    SELECT
      SUM(CASE WHEN Monat >= Statistik.Monat+1
            THEN AbverkauftMenge
            ELSE 0
          END) / SUM(IstBestand) * 13
    FROM
      Statistik x
    WHERE Kunde = Statistik.Kunde
      AND Artikel = Statistik.Artikel
      AND Col = Statistik.Col
      AND Jahr >= Statistik.Jahr-1 AND Monat >= Statistik.Monat+1
      AND Jahr <= Statistik.Jahr AND Monat <= Statistik.Monat
  )
  Mit Zitat antworten Zitat
Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#10

AW: Kompliziertes Update Statement

  Alt 16. Mai 2012, 10:12
So, ich hab das jetzt erstmal so gelöst:

Code:
UPDATE
  Statistik
SET
  LUG =
  (
    SELECT
      SUM(AbverkauftMenge) AS Menge
    FROM
      Statistik a
    WHERE
     a.Kunde = Statistik.Kunde
     AND a.Artikel = Statistik.Artikel
     --AND a.Col = Statistik.Col
      AND ((a.Jahr >= Statistik.Jahr-1 AND a.Monat >= Statistik.Monat+1)
     AND (a.Jahr <= Statistik.Jahr AND a.Monat <= Statistik.Monat))
  )
  / 
  ( 
    SELECT
      IFNULL(SUM(IstBestand),1000000) AS Menge
    FROM
      Statistik b
    WHERE
     b.Kunde = Statistik.Kunde
     AND b.Artikel = Statistik.Artikel
     --AND b.Col = Statistik.Col
      AND ((b.Jahr >= Statistik.Jahr-1 AND b.Monat >= Statistik.Monat)
     AND (b.Jahr <= Statistik.Jahr AND b.Monat <= Statistik.Monat))
  )
  * 13 
WHERE Jahr = 2010
ist noch lange nicht dass was ich wollte, aber es scheint schon der richtige Weg zu sein. Ich werde da sicher noch weiter dran arbeiten (@omata, deinen vorschlag ausprobieren zB) aber da meine EIngangsfragen gelöst sind, bedanke ich mich bei euch für eure Hilfe und markiere dieses Thema als gelöst.

Klasse Forum! Wie immer ^^
:: don't Panic ::
  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 19:11 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