Seite 1 von 1
MySQL - Ist-Wert und Plan-Wert nebeneinander
Verfasst: Mi, 08.07.2009 16:20
von heinz_ketchup
Hallo liebe Helfenden,
ich hab irgendwie einen Knoten im Kopf und hoffe auf einen kleinen Denkanstoß von euch. Hier mein Problem:
Ich möchte eine Tabelle erzeugen, die mir ein Konto, die Kontenbezeichnung, den Ist-Wert und den Plan-Wert zu dem Konto liefert.
Meine Query dazu sieht so aus:
Code: Alles auswählen
SET @monat := 5;
SET @jahr := 2009;
SELECT id_debtnr AS 'Debt-Nr',
id_beschreibung AS Debitorenbezeichnung,
id_pc_oan AS Profitcenter,
SUM(-1 * id_wert) AS 'Umsatz-Ist',
(SELECT SUM(-1 * dp_wert) FROM debitoren_plan WHERE dp_jahr = @jahr AND dp_monat = @monat) AS 'Umsatz-Plan'
FROM istdaten WHERE id_jahr = @jahr AND id_monat = @monat AND id_debtnr > 0
GROUP BY id_debtnr ORDER BY id_debtnr
Leider passt etwas nicht mit meinem zweiten Select, der die Plandaten abfragen soll. Ich glaube es liegt irgendwie daran, dass die Konto-Nr. (id_debtnr) nicht im zweiten Select enthalten ist.
Vielleicht sieht ja jemand von euch sofort meinen Denkfehler.
Schon jetzt danke für eure Hilfe und schöne Grüße
Werner
PS: Leider kann ich kein Beispiel hochladen, weil mein Kontingent erschöpft ist. Kann mir vielleicht jemand dazu weiterhelfen? Was bedeutet das und was kann ich machen um diesen Zustand zu ändern? Danke!
Re: MySQL - Ist-Wert und Plan-Wert nebeneinander
Verfasst: Mi, 08.07.2009 17:57
von eBayer
Hallo,
ich bin zwar kein SQL-Profi..... aber was hast Du mit dem Semikolon vor der letzten Klammer vor?
Gruß eBayer
Re: MySQL - Ist-Wert und Plan-Wert nebeneinander
Verfasst: Mi, 08.07.2009 18:56
von heinz_ketchup
Hallo eBayer,
danke für Deinen Tipp, jetzt gibt's schon mal keine Fehlermeldung mehr.
Leider passen die Planwerte noch nicht zur Kontonummer.
Schöne Grüße
Werner
Re: MySQL - Ist-Wert und Plan-Wert nebeneinander
Verfasst: Sa, 11.07.2009 12:01
von Barlee
Hallo Heinz,
gehe ich recht in der Annahme, dass id_debtnr auch in der Tabelle debitoren_plan enthalten ist?
Probiere dann mal bitte eine Erweiterung des zweiten Selects von
Code: Alles auswählen
(SELECT SUM(-1 * dp_wert) FROM debitoren_plan WHERE dp_jahr = @jahr AND dp_monat = @monat)
auf
Code: Alles auswählen
(SELECT SUM(-1 * dp_wert) FROM debitoren_plan WHERE dp_jahr = @jahr AND dp_monat = @monat
AND istdaten.id_debtnr = debitoren_plan.id_debtnr)
Gruß Barlee
Re: MySQL - Ist-Wert und Plan-Wert nebeneinander
Verfasst: Di, 14.07.2009 14:07
von heinz_ketchup
Hallo Barlee,
vielen Dank für Deine Hilfe! Das klappt soweit schon ganz gut.
Hier meine verbesserte Abfrage:
Code: Alles auswählen
SET @monat := 5;
SET @jahr := 2009;
SELECT
id_debtnr AS 'Debt-Nr',
id_beschreibung AS 'Debitorenbezeichnung',
id_pc_oan AS 'Profitcenter',
SUM(-1 * id_wert) AS 'Umsatz Ist',
(SELECT SUM(dp_wert) FROM debitoren_plan WHERE dp_jahr = @jahr AND dp_monat <= @monat AND istdaten.id_debtnr = debitoren_plan.dp_debtnr) AS 'Umsatz Plan'
FROM istdaten WHERE id_jahr = @jahr AND id_monat <= @monat GROUP BY id_debtnr ORDER BY id_debtnr
Leider ergibt sich jetzt ein neues Problem. Es werden nur Werte für id_debtnr angezeigt, die in istdaten vorhanden sind. Die Debt-Nr, die nur in der Planung vorhanden sind fallen bei der obigen Abfrage unter den Tisch. Wie muss meine Abfrage verändert werden, dass ich auch Debt-Nr angezeigt bekomme, die nur in der debitoren_plan vorhanden sind?
Viele Grüße
Werner
Re: MySQL - Ist-Wert und Plan-Wert nebeneinander
Verfasst: Di, 14.07.2009 14:10
von keksi1970
schreib in der Planung als debt-nr eine "0" und lege die null an
LG
Andreas
Re: MySQL - Ist-Wert und Plan-Wert nebeneinander
Verfasst: Di, 14.07.2009 17:11
von heinz_ketchup
... danke, Andreas, für Deinen pragmatischen Lösungsansatz. Genauso hätte ich es gemacht, wenn es sich nur um eine Debt-Nr gehandelt hätte.
Sorry, ich habe mich leider bei der Formulierung meiner Frage nicht eindeutig ausgedrückt.
Ich benötige schon explizit die Debt-Nummern (es sind viele) mit den einzelnen Planwerten, für die noch kein Ist-Umsatz in den Istdaten vorhanden ist.
Schöne Grüße
Werner
Re: MySQL - Ist-Wert und Plan-Wert nebeneinander
Verfasst: Di, 14.07.2009 18:21
von keksi1970
hmm,
also hab ich das jetzt richtig verstanden ?
du willst debt-nr wos keine gibt ?
AND istdaten.id_debtnr = debitoren_plan.dp_debtnr) Zeigt nur Daten an, die in beiden Vorhanden sind.
keine istdaten.id_debtnr = keine Daten
Re: MySQL - Ist-Wert und Plan-Wert nebeneinander
Verfasst: Di, 14.07.2009 22:41
von Barlee
Hallo Heinz,
ich würde den Inline View
Code: Alles auswählen
(SELECT SUM(dp_wert) FROM debitoren_plan WHERE dp_jahr = @jahr AND dp_monat <= @monat AND istdaten.id_debtnr = debitoren_plan.dp_debtnr) AS 'Umsatz Plan'
rauslösen und nachher mit der restlichen Abfrage mit einem LEFT JOIN verbinden.
Nachfolgendes ist ungetestet und soll der Veranschaulichung einer möglichen Herangehensweise dienen:
Code: Alles auswählen
SELECT
Tab_B.Dept-Nr,
Tab_B.Debitorenbezeichnung,
Tab_B.Profitcenter.
Tab_B.Umsatz Ist,
Tab_A.sum_dp_wert
FROM
(
SELECT SUM(dp_wert) AS 'sum_dp_wert', dp_debtnr
FROM debitoren_plan
WHERE dp_jahr = @jahr AND dp_monat <= @monat
GROUP BY dp_debtnr
) Tab_A LEFT JOIN
(
SELECT
id_debtnr AS 'Debt-Nr',
id_beschreibung AS 'Debitorenbezeichnung',
id_pc_oan AS 'Profitcenter',
SUM(-1 * id_wert) AS 'Umsatz Ist',
FROM istdaten
WHERE id_jahr = @jahr AND id_monat <= @monat
GROUP BY id_debtnr
ORDER BY id_debtnr
) Tab_B ON Tab_A.debtnr=Tab_B.Debt-Nr
Gruß Barlee
Re: MySQL - Ist-Wert und Plan-Wert nebeneinander
Verfasst: Di, 14.07.2009 22:53
von heinz_ketchup
... ok, ist vielleicht nur einfach zu verstehen, wenn man das Ergebnis schon vor Augen sieht und nur noch nicht weiß, wie man es in SQL realisieren soll.
Ich versuche mich nun mal unqualifiziert-fachmännisch auszudrücken, sozusagen eine N zu N Beziehung, oder so ähnlich.
Ich benötige aus den beiden Tabellen istdaten und debitoren_plan die Summen aller vorhandenen Debitoren-Nummern, kumuliert bis zum Auswertungsmonat, egal ob sie in einer oder beiden der Tabellen vorhanden sind.
Sind die Debitoren-Nummern in beiden Tabellen vorhanden, dann gibt es einen Ist-Wert und einen Plan-Wert. Im anderen Fall, gibt es nur einen Ist-Wert, oder einen Plan-Wert.
Vielleicht muß man da mit einem UNION ALL arbeiten, kommt mir jetzt so als spontane Idee.
Vorab schon mal vielen Dank für das Interesse. Bin schon gespannt, wie die Lösung meines Problems aussehen könnte.
Schöne Grüße
Werner
Re: MySQL - Ist-Wert und Plan-Wert nebeneinander
Verfasst: Di, 14.07.2009 22:59
von heinz_ketchup
Hallo Barlee,
meine vorstehende Erläuterung hat sich noch auf die Frage von keksi bezogen. Vielen Dank für Deine Antwort, die sich mit meinem Erklärungsversuch überschnitten hat. Ich werde Deinen Vorschlag morgen testen.
Für Deine genialen Verschachtelungen brauche ich immer etwas Gehirnschmalz
Ich hatte es im Vorfeld zu meinem Post auch schon mit einem LEFT JOIN versucht, bin aber kläglich gescheitert.
Nochmals Danke und schöne Grüße
Werner
Re: MySQL - Ist-Wert und Plan-Wert nebeneinander
Verfasst: Mi, 15.07.2009 18:30
von Barlee
Hallo Heinz,
die Erklärung ist trotzdem hilfreich gewesen. Deine Anforderung:
Sind die Debitoren-Nummern in beiden Tabellen vorhanden, dann gibt es einen Ist-Wert und einen Plan-Wert. Im anderen Fall, gibt es nur einen Ist-Wert, oder einen Plan-Wert.
lässt sich mit einem einzelnen LEFT JOIN nicht vollständig realisieren, da nur die eine Tabelle zur übergeordneten "erklärt" wird.
In Deinem Fall benötigst Du tatsächlich einen FULL OUTER JOIN, den man -wie Du schon richtig angeführt hast- über UNION ALL umsetzen kann. Also ungefähr so:
Code: Alles auswählen
SELECT
Tab_B.Dept-Nr,
Tab_B.Debitorenbezeichnung,
Tab_B.Profitcenter.
Tab_B.Umsatz Ist,
Tab_A.sum_dp_wert
FROM
(
SELECT SUM(dp_wert) AS 'sum_dp_wert', dp_debtnr
FROM debitoren_plan
WHERE dp_jahr = @jahr AND dp_monat <= @monat
GROUP BY dp_debtnr
) Tab_A JOIN
(
SELECT
id_debtnr AS 'Debt-Nr',
id_beschreibung AS 'Debitorenbezeichnung',
id_pc_oan AS 'Profitcenter',
SUM(-1 * id_wert) AS 'Umsatz Ist',
FROM istdaten
WHERE id_jahr = @jahr AND id_monat <= @monat
GROUP BY id_debtnr
ORDER BY id_debtnr
) Tab_B ON Tab_A.debtnr=Tab_B.Debt-Nr
UNION ALL
SELECT
Tab_B.Dept-Nr,
Tab_B.Debitorenbezeichnung,
Tab_B.Profitcenter.
Tab_B.Umsatz Ist,
Tab_A.sum_dp_wert
FROM
(
SELECT SUM(dp_wert) AS 'sum_dp_wert', dp_debtnr
FROM debitoren_plan
WHERE dp_jahr = @jahr AND dp_monat <= @monat
GROUP BY dp_debtnr
) Tab_A LEFT JOIN
(
SELECT
id_debtnr AS 'Debt-Nr',
id_beschreibung AS 'Debitorenbezeichnung',
id_pc_oan AS 'Profitcenter',
SUM(-1 * id_wert) AS 'Umsatz Ist',
FROM istdaten
WHERE id_jahr = @jahr AND id_monat <= @monat
GROUP BY id_debtnr
ORDER BY id_debtnr
) Tab_B ON Tab_A.debtnr=Tab_B.Debt-Nr
WHERE Tab_B.debtnr IS NULL
UNION ALL
SELECT
Tab_B.Dept-Nr,
Tab_B.Debitorenbezeichnung,
Tab_B.Profitcenter.
Tab_B.Umsatz Ist,
Tab_A.sum_dp_wert
FROM
(
SELECT SUM(dp_wert) AS 'sum_dp_wert', dp_debtnr
FROM debitoren_plan
WHERE dp_jahr = @jahr AND dp_monat <= @monat
GROUP BY dp_debtnr
) Tab_A RIGHT JOIN
(
SELECT
id_debtnr AS 'Debt-Nr',
id_beschreibung AS 'Debitorenbezeichnung',
id_pc_oan AS 'Profitcenter',
SUM(-1 * id_wert) AS 'Umsatz Ist',
FROM istdaten
WHERE id_jahr = @jahr AND id_monat <= @monat
GROUP BY id_debtnr
ORDER BY id_debtnr
) Tab_B ON Tab_A.debtnr=Tab_B.Debt-Nr
WHERE Tab_A.debtnr IS NULL
Gruß Barlee
Re: MySQL - Ist-Wert und Plan-Wert nebeneinander
Verfasst: Mi, 15.07.2009 18:41
von keksi1970
zumindest hab ichs nu verstanden, was du eigentlich willst.
dem von barlee kann ich auf die schnelle noch nicht folgen, müsste ich praktisch umsetzen
aber du siehst, wie "dumme" Fragen von mir auch manchmal einen Lösungsansatz/Lösungshilfe beinhalten.
an alle mitlesenden : Ihr solltet euer Problem für "Dummies" beschreiben, nicht jeder kann ein bestimmtes, problembezogenes Fachwissen haben, aber viele vielleicht eine Lösung für ähnliches
LG
Andreas
(das nur als Antwort)