von Barlee » Mi, 15.07.2009 18:30
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
Hallo Heinz,
die Erklärung ist trotzdem hilfreich gewesen. Deine Anforderung:
[quote]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.[/quote]
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]
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
[/code]
Gruß Barlee