Zitat von
Hansa:
Meine Vermutung 8) :
pagid IN ("PIM5231","PIM5244")
Mache mal da einen der beiden Werte weg, ob sich dann was ändert.
Ja na klar ändert sich da was, was ja auch nur sinnvoll und so gewollt ist
Wenn ich allerdings nur einen Wert drin habe, sind die Summen im Ergebnis auch verdoppelt. Bereinigt wird das, wenn ich die Tabelle daten_prognose aus der FROM-clause wegnehme (s.a. unten für den Normalfall, der ja funktioniert).
Nochmal kurz zum Tabellendesign:
Ich habe 2 Tabellen mit Daten: ISTWERTE und PROGNOSEWERTE und eine Tabelle mit Beziehungen, welches Umsatz-/Kostenarten zu welcher Umsatz-/Kostengruppe gehören. Hier am Beispiel ist "2000" die Umsatzgruppe "Umsatz ohne interne Verrechnung" und dazu gehören die Umsatzarten "Umsatz Beratung, Umsatz Projekte, etc.".
In der einen Tabelle stehen von allen Kostenstellen einmal die Istwerte und in der anderen von allen Kostenstellen die Prognosewerte drin.
In meinem Programm gibt es 2 Sichten auf die Daten:
Der Kostenstellenverantwortliche kann sich seine Prognosewerte anschauen und es gibt eine gemixte Sicht, die die bisher vorliegenden Istwerte und "auffüllend" die Prognosewerte bis zum Jahresende anzeigt - auf dieser Ebene funktioniert die entsprechende
SQL-Abfrage auch.
Jetzt gibt es aber aber auch Geschäftsbereichsleiter, die es interessiert, welche Zahlen der Geschäftsbereich hat und diese setzen sich aus den Kostenstellen zusammen.
Für die Prognosesicht funktioniert ein analoges
SQL-Statement, für diese gemixte Ist/Prognose-Sicht leider nicht.
Zu dem IN-Statement: Ein Geschäftsbereich hat x Kostenstellen. Genau diese x Kostenstellen sind in der
DB hinterlegt und werden im IN-Statement abgefragt.
Hier ist das
SQL-Statement für die Aggregation der PROGNOSEWERTE, die fehlerfrei funktioniert:
Delphi-Quellcode:
frmMain.ZQPOS.SQL.Add('SELECT p.posid, p.posbez, ');
frmMain.ZQPOS.SQL.Add('SUM(JAN) AS JAN, SUM(FEB) AS FEB, SUM(MAR) AS MAR, SUM(APR) AS APR, SUM(MAI) AS MAI, SUM(JUN) AS JUN, SUM(JUL) AS JUL, SUM(AUG) AS AUG, SUM(SEP) AS SEP, SUM(OKT) AS OKT, SUM(NOV) AS NOV, SUM(DEZ) AS DEZ, ');
frmMain.ZQPOS.SQL.Add('SUM(JAN_1) AS JAN_1, SUM(FEB_1) AS FEB_1, SUM(MAR_1) AS MAR_1, SUM(APR_1) AS APR_1, SUM(MAI_1) AS MAI_1, SUM(JUN_1) AS JUN_1 ');
frmMain.ZQPOS.SQL.Add('FROM positionen p, daten_prognose i ');
frmMain.ZQPOS.SQL.Add(Format('WHERE p.pgid=:pgid AND p.posid=i.position AND i.pagid IN (%s) ', [strDataID]));
frmMain.ZQPOS.SQL.Add('GROUP BY p.posid');
Und hier das
SQL-Statement für die gemixte Sicht (Ist/Prognose)
auf Kostenstellenebene (also nur für eine Kostenstelle), welche auch fehlerfrei funktioniert:
Delphi-Quellcode:
ZQPOS.SQL.Add('SELECT DISTINCT i.position, pos.posbez, ');
ZQPOS.SQL.Add(strIstPlan);
ZQPOS.SQL.Add('FROM daten_ist i, daten_prognose p, positionen pos ');
ZQPOS.SQL.Add('WHERE i.position=p.position AND i.position=pos.posid ');
ZQPOS.SQL.Add('AND i.pagid=:pagid AND pos.pgid=:pgid');
(in strIstPlan steht die generierte Monatsauswahl Plan/Ist, wie im ersten Post drin)
Wie gesagt, vermute ich, dass durch die Tabellenkreuzung im ursprünglichen Post irgendwas doppelt durchlaufen wird.
Gruß Igotcha