MySQL - Ist-Wert und Plan-Wert nebeneinander

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

heinz_ketchup
****
Beiträge: 111
Registriert: So, 07.10.2007 16:05
Wohnort: München

MySQL - Ist-Wert und Plan-Wert nebeneinander

Beitrag 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!
Zuletzt geändert von heinz_ketchup am Mi, 08.07.2009 18:56, insgesamt 1-mal geändert.
------------------------------------------------------------
LibreOffice 3.5.4.2 auf Mac OS X 10.10.1 und MySQL 5.5
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: MySQL - Ist-Wert und Plan-Wert nebeneinander

Beitrag von eBayer »

Hallo,
ich bin zwar kein SQL-Profi..... aber was hast Du mit dem Semikolon vor der letzten Klammer vor?
Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
heinz_ketchup
****
Beiträge: 111
Registriert: So, 07.10.2007 16:05
Wohnort: München

Re: MySQL - Ist-Wert und Plan-Wert nebeneinander

Beitrag 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
------------------------------------------------------------
LibreOffice 3.5.4.2 auf Mac OS X 10.10.1 und MySQL 5.5
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: MySQL - Ist-Wert und Plan-Wert nebeneinander

Beitrag 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
heinz_ketchup
****
Beiträge: 111
Registriert: So, 07.10.2007 16:05
Wohnort: München

Re: MySQL - Ist-Wert und Plan-Wert nebeneinander

Beitrag 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
------------------------------------------------------------
LibreOffice 3.5.4.2 auf Mac OS X 10.10.1 und MySQL 5.5
keksi1970
*****
Beiträge: 464
Registriert: So, 27.01.2008 11:47
Wohnort: DU

Re: MySQL - Ist-Wert und Plan-Wert nebeneinander

Beitrag von keksi1970 »

schreib in der Planung als debt-nr eine "0" und lege die null an

LG
Andreas
heinz_ketchup
****
Beiträge: 111
Registriert: So, 07.10.2007 16:05
Wohnort: München

Re: MySQL - Ist-Wert und Plan-Wert nebeneinander

Beitrag 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
------------------------------------------------------------
LibreOffice 3.5.4.2 auf Mac OS X 10.10.1 und MySQL 5.5
keksi1970
*****
Beiträge: 464
Registriert: So, 27.01.2008 11:47
Wohnort: DU

Re: MySQL - Ist-Wert und Plan-Wert nebeneinander

Beitrag 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
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: MySQL - Ist-Wert und Plan-Wert nebeneinander

Beitrag 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
heinz_ketchup
****
Beiträge: 111
Registriert: So, 07.10.2007 16:05
Wohnort: München

Re: MySQL - Ist-Wert und Plan-Wert nebeneinander

Beitrag 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
------------------------------------------------------------
LibreOffice 3.5.4.2 auf Mac OS X 10.10.1 und MySQL 5.5
heinz_ketchup
****
Beiträge: 111
Registriert: So, 07.10.2007 16:05
Wohnort: München

Re: MySQL - Ist-Wert und Plan-Wert nebeneinander

Beitrag 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
------------------------------------------------------------
LibreOffice 3.5.4.2 auf Mac OS X 10.10.1 und MySQL 5.5
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: MySQL - Ist-Wert und Plan-Wert nebeneinander

Beitrag 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
keksi1970
*****
Beiträge: 464
Registriert: So, 27.01.2008 11:47
Wohnort: DU

Re: MySQL - Ist-Wert und Plan-Wert nebeneinander

Beitrag 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)
Antworten