Mehrere Tabellen zur Summenzeile zusammenfügen

MysterioJN

SQL-Guru
Beiträge
158
Guten Morgen,

der Myst wieder. Aber brauch ein paar Denkanstöße

Ausgangssituation:

Tabelle: Messen
(Jahr, Artikelnummer, Absatz, Umsatz)
2016, 2354, 15, 140

Tabelle: Downloads
(Jahr, Artikelnummer, Stueck, Erloes)
2016, 2354, 25, 320

Ziel soll sein, die beiden Tabellen in einander zu "vereinen" (Zeilenweise, wenn gleiche Artikelnummer).
Jahr = Jahr, Artikelnummer = Artikelnummer, Absatz = Stueck, Umsatz = Erloes
Das Jahr soll nur Daten aus 2016 sein.


Ergebniszeile soll so aussehen je Artikelnummer:
(Jahr, Artikelnummer, Absatz, Umsatz)
2016, 2354, 40, 460

Habt ihr eine Lösung für mich parat?

Beste Grüße

Marco
 
Werbung:
joine beide über (jahr, artikelnummer), addiere absatz+stueck sowie umsatz+erloes und gruppiere über die ersten beiden Spalten. Alternativ ein UNION der beiden Tabellen und da drüber addieren & gruppieren.
 
Code:
Select

aid_Medien.dbo.Messen.Jahr,
aid_Medien.dbo.Messen.BstNr,
SUM(aid_Medien.dbo.Messen.Absatz),
SUM(aid_Medien.dbo.Messen.Umsatz)

FROM aid_Medien.dbo.Messen

GROUP BY Jahr, Bstnr


UNION

SELECT

aid_Medien.dbo.Downloads.Jahr,
aid_Medien.dbo.Downloads.BstNr,
SUM(aid_Medien.dbo.Downloads.Stueck),
SUM(aid_Medien.dbo.Downloads.Erloes)

FROM aid_Medien.dbo.Downloads
GROUP BY Jahr, Bstnr

Und wie kann ich jetzt das Ergebnis "darüber" Gruppieren?
 
so:

Code:
test=*# select * from messen ;
 jahr | artikel | absatz | umsatz
------+---------+--------+--------
 2015 |  2354 |  10 |  100
 2016 |  2354 |  15 |  140
 2017 |  2354 |  20 |  99
(3 Zeilen)

test=*# select * from downloads ;
 jahr | artikel | stueck | erloes
------+---------+--------+--------
 2015 |  2354 |  10 |  200
 2016 |  2354 |  25 |  320
(2 Zeilen)

test=*# select jahr, artikel, sum(absatz), sum(umsatz) from (select * from messen union all select * from downloads) gesamt group by jahr, artikel;
 jahr | artikel | sum | sum
------+---------+-----+-----
 2016 |  2354 |  40 | 460
 2017 |  2354 |  20 |  99
 2015 |  2354 |  20 | 300
(3 Zeilen)
 
Alternativ:

Code:
Select

aid_Medien.dbo.Messen.Jahr AS Jahr,
aid_Medien.dbo.Messen.BstNr AS BstNr,
(SUM(aid_Medien.dbo.Messen.Absatz) + SUM(aid_Medien.dbo.Downloads.Stueck)) AS Absatz,
(SUM(aid_Medien.dbo.Messen.Umsatz) + SUM(aid_Medien.dbo.Downloads.Erloes)) AS Umsatz

FROM aid_Medien.dbo.Messen
JOIN aid_Medien.dbo.Downloads ON aid_Medien.dbo.Downloads.Jahr = aid_Medien.dbo.Messen.Jahr AND aid_Medien.dbo.Downloads.BstNr = aid_Medien.dbo.Messen.BstNr

WHERE aid_Medien.dbo.Messen.Jahr = '2016' AND aid_Medien.dbo.Downloads.Jahr = '2016'
GROUP BY aid_Medien.dbo.Messen.Jahr, aid_Medien.dbo.Messen.BstNr

Dann musst du mir nur kurz mal helfen mit der "Join" Bedeutung. Es kann echt vorkommen, dass es Artikelnummern mal in der einen Tabelle gibt und in der anderen nicht. Das Ganze auch umgekehrt.

Welcher JOIN muss ich nehmen, damit er mir IMMER alle Datensätze anzeigt. Auch wenn er mal in einer der Tabellen keinen Eintragt zur Bestellnummer findet?
 
ich denke mal, in diesem Falle ist die UNION-Version sinnvoller und auch schneller. Ansonsten wohl erst einmal alle möglichen Jahre & Artikel erfassen und dagegen joinen.
 
Mir gefällt deine Lösung auch echt besser. Wobei ich mich frage, woher er weiß, welche Spalte zusammen gehört (Absatz + Stueck, Umsatz + Erloes), trotz unterschiedlicher Bennenung in der DB. Oder liegt es an der Reihenfolge der Schreibweise?

Code:
select
Jahr,
BstNr,
sum(absatz),
sum(umsatz)
from
(Select Jahr, BstNr, Absatz, Umsatz
from aid_Medien.dbo.Messen union all select Jahr, BstNr, Stueck, Erloes from aid_Medien.dbo.Downloads) gesamt

WHERE Jahr = '2017'
GROUP by jahr, bstnr
ORDER BY BstNr ASC
 
die Spalten der ersten Tabelle im Union geben das vor, die Spalten der anderen Tabellen müssen vom Datentyp her passen. Falls die Tabellen unterschiedlich sind halt passende Select-Liste, Casten und so weiter, damit es paßt.
 
Wenn ich jetzt noch eine 3. und 4. Tabelle dazu setzten muss, knüpfe ich diese einfach mit weiteren UNION ALL nach dem obigen Prinzip an, richtig?

Bin froh das du mir geholfen hast. Ich probier mich jetzt mal aus.

Ich dank dir viel Mals!!


EDIT: YES hab es dank dir hinbekommen!!! Echt noch mal vielen Dank!
 
Zuletzt bearbeitet:
Werbung:
Hmm ja das ist schwierig. An meinen in liquidation befindlichen Arbeitgeber xD

Nur ob du da noch was bekommst.... ;)

Echt noch mal lieben Dank. War ja gar nicht so kompliziert wie ich vorher immer gedacht/probiert habe (wenn man mal mit der Nase darauf gedrückt wird).

Hab einen guten Wochenstart und bestimmt bis demnächst mal
 
Zurück
Oben