![]() |
Datenbank: MSSQL 2000 • Zugriff über: ODBC
SQL: FULL OUTER JOIN mit sich selbst
Hallo zusammen,
ich will eine Auswertung auf eine Tabelle machen. Umsatz pro Debitor Dabei sollen die Daten aus dem Jahr 2009 mit dem Jahr 2008 verglichen werden. Wenn Debitoren in dem einen Jahr nicht sind sollen sie trotzdem nicht unterschlagen werden. Das Ergebnis soll also so aussehen:
SQL-Code:
Es klappt aber nicht:
SELECT SUM(AktuellesJahr.Umsatz) AS Summe_Umsatz,
SUM(Vorjahr.Umsatz) AS Summe_Umsatz_Vorjahr, AktuellesJahr.Debitor_ID FROM dbo.DBRechnung Vorjahr FULL OUTER JOIN dbo.DBRechnung AktuellesJahr ON Vorjahr.UnternehmenNr_ID = AktuellesJahr.UnternehmenNr_ID AND Vorjahr.Monat_ID = AktuellesJahr.Monat_ID AND Vorjahr.Debitor_ID = AktuellesJahr.Debitor_ID AND Vorjahr.Artikel_ID = AktuellesJahr.Artikel_ID WHERE (AktuellesJahr.Jahr_ID = 2009) AND (AktuellesJahr.Monat_ID = 1) AND (AktuellesJahr.UnternehmenNr_ID = 3) AND (Vorjahr.Jahr_ID = 2008) AND (Vorjahr.Monat_ID = 1) AND (Vorjahr.UnternehmenNr_ID = 3) GROUP BY AktuellesJahr.Debitor_ID a) ich bekomme nur die einen Teil der Daten (nur die welche in beiden Jahren sind) b) Die Summen sind falsch Etwa so:
Ich komme einfach nicht drauf was ich falsch mache :pale: |
Re: SQL: FULL OUTER JOIN mit sich selbst
Hi,
auf den ersten schnellen Blick fällt auf:
SQL-Code:
damit selektierst du bestimmte Zeilen aus der Vorjahr-Datenmenge und verhinderst, das
where ... AND (Vorjahr.Monat_ID = 1) AND (Vorjahr.UnternehmenNr_ID = 3)
NULL-Werte aus Vorjahr eingeschlossen werden... |
Re: SQL: FULL OUTER JOIN mit sich selbst
Hi,
Zitat:
Ich will ja zwei verschiedene Datenbereiche zusammen fügen. Daten aus 01/2009 mit Daten aus 01/2008. Ups Fehler in meinem original Posting: Debitor --- Umsatz_2009 ---- Umsatz_2009 Debitor --- Umsatz_2008 ---- Umsatz_2009 Hab's geändert Davon abgesehen: auch wenn ich sage
SQL-Code:
bekomme ich die selben Daten.
WHERE (AktuellesJahr.Jahr_ID = 2009) AND (AktuellesJahr.Monat_ID = 1) AND (AktuellesJahr.UnternehmenNr_ID = 3) AND
(Vorjahr.Jahr_ID = 2008) Übrigens egal ob ich JOIN, FULL OUTER JOIN, LEFT JOIN oder RIGHT JOIN sage. der Datenbestand für die zwei Zeiträume ist aber definitiv unterschiedlich Das kann nur eins bedeuten: Ich hab da irgendwo ein grundsätzliches Verständnisproblem |
Re: SQL: FULL OUTER JOIN mit sich selbst
Ich bin jetzt auch ein bisschen kirre, aber was kommt hierbei heraus?
SQL-Code:
SELECT
SUM(CASE A.Umsatz WHEN NULL THEN 0 ELSE A.Umsatz) AS Summe_Umsatz, SUM(CASE V.Umsatz WHEN NULL THEN 0 ELSE V.Umsatz) AS Summe_Umsatz_Vorjahr, A.Debitor_ID FROM dbo.DBRechnung V FULL OUTER JOIN dbo.DBRechnung A ON V.UnternehmenNr_ID = A.UnternehmenNr_ID AND V.Monat_ID = A.Monat_ID AND V.Debitor_ID = A.Debitor_ID AND V.Artikel_ID = A.Artikel_ID WHERE A.Jahr_ID = 2009 AND A.Monat_ID = 1 AND A.UnternehmenNr_ID = 3 GROUP BY A.Debitor_ID |
Re: SQL: FULL OUTER JOIN mit sich selbst
Wenn unbekannt ist, ob bzw. in welchem Jahr gar keine Daten drin sind, braucht man dann nicht noch die Debitor-Tabelle? (Möglicherweise erledigt das der full outer join, aber damit hab ich noch nie gearbeitet).
Also so irgendwie:
SQL-Code:
select
* from debitor left outer join umsatz_vorjahr on ... left outer join umsatz_aktuelles Jahr on ... where ... |
Re: SQL: FULL OUTER JOIN mit sich selbst
Du brauchst im Grunde 3 Datenmengen, die Du zusammenjoinen mußt:
Diese Daten kannst Du alle aus dbo.DBRechnung gewinnen. Beispiel:
SQL-Code:
Ich habe da die Artikel und den Monat rausgelassen. wenn Du das Ganze auch noch artikelweise und/oder monatsweise auswerfen willst, muss entsprechend ergänzt werden.
SELECT a.DEBITOR_ID,
sum (b.Umsatz) AktUmsatz, sum (c.Umsatz) OldUmsatz FROM dbo.DBRechnung a LEFT JOIN dbo.DBRechnung b on ((b.DEBITOR_ID=a.DEBITOR_ID) AND (b.JAHR_ID = :AktJahr)) LEFT JOIN dbo.DBRechnung c on ((c.DEBITOR_ID=a.DEBITOR_ID) AND (c.JAHR_ID = :AktJahr - 1)) WHERE a.JAHR_ID in (:AktJahr, :AktJahr - 1) GROUP BY a.DEBITOR_ID Gruß Thomas PS: Trocken runtergeschrieben, ungetestet |
Re: SQL: FULL OUTER JOIN mit sich selbst
Hi All,
@DeddyH Ich habe es mit
SQL-Code:
probiert, was mir aber die selben(falschen) Ergebisse bringt.
SELECT
SUM(ISNULL(A.Umsatz,0)) AS Summe_Umsatz, SUM(ISNULL(V.Umsatz,0)) AS Summe_Umsatz_Vorjahr, A.Debitor_ID FROM dbo.DBRechnung V FULL OUTER JOIN dbo.DBRechnung A ON V.UnternehmenNr_ID = A.UnternehmenNr_ID AND V.Monat_ID = A.Monat_ID AND V.Debitor_ID = A.Debitor_ID AND V.Artikel_ID = A.Artikel_ID WHERE A.Jahr_ID = 2009 AND V.Jahr_ID = 2008 AND A.Monat_ID = 1 AND A.UnternehmenNr_ID = 3 GROUP BY A.Debitor_ID @mquadrat und TBx hm.. über die Stammtabellen (Debitorenen, Artikel) gehen, ja das wäre eine Möglichkeit. daran habe ich nicht gedacht. Ich versehe zwar immer noch nicht was bei dem anderen Ansatz falsch ist, aber einen View (oder so) Debitoren mit ihren Artikeln und ihren Umsätzen sollte das Problem lösen Danke! :dp: |
Re: SQL: FULL OUTER JOIN mit sich selbst
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz