Zwei Selects in einen schreiben

MysterioJN

SQL-Guru
Beiträge
158
Hallo zusammen,

ich habe zwei Tabellen und zwei Selects:

select vorgangsnummer, sum(mehrwertsteuer_bet), sum(bruttobetrag), count(vorgangsnummer) from dm_cf where jahr > 2013 group by vorgangsnummer

;

select vorgang, sum(k2.buch_betrag), count(vorgang) from klr_buch2_kopf k2 where jahr >2013 group by vorgang

Wenn ich die Ergebnisse nebeneinander lege, stimmen die Datenzeilen und Inhalte überein.

Mein Ziel soll also sein, einen Select zu haben, der die folgenden Spalten beinhaltet und die oben gewonnenen Ergebnisse "nebeneinander legt":
- Vorgangsnummer
- Mehrwertsteuer_bet,
- bruttobetrag
- buch_betrag


Ich habe es mit Join versucht, was aber zu falschen Ergebnissen geführt hat (zum Teil stimmt dann buch_betrag nicht mit bruttobetrag überein (sind doppelt oder Mehrfach "summiert":

select vorgangsnummer, vorgang, sum(mehrwertsteuer_bet), sum(bruttobetrag), sum(k2.buch_betrag) from dm_cf inner join klr_buch2_kopf k2 on dm_cf.vorgangsnummer = k2.vorgang group by vorgangsnummer, vorgang


Was mach ich falsch?
 
Werbung:
ok, vlt hilft das weiter:

In jeder Tabelle können eine oder mehrere Datenzeilen sein, die zu einem Vorgang/Vorgangsnummer gehören.
Also gilt nicht zwingend: 1 Datenzeile = 1 Vorgang sonder 1 Vorgang = x Datenzeilen

Hier ist es grundlegend in Ordnung, wobei mir im dritten Select keine zwei Zeilen ausgegeben werden sollen.

ok.PNG


Um also in jeder Tabelle nur eine Datenzeile pro Vorgang zu erhalten muss ich Sum() und Group by verwenden. Die Ergebnisse der ersten beiden Selects im folgenden Bild sind in Ordnung.
Aber das Ergebnis im dritten Select nicht... , obwohl wir nun in einer Zeile das Ergebnis haben. Er nimmt wohl die 907,38 Euro doppelt.

nicht ok.PNG
 
Zuletzt bearbeitet:
warum gruppierst Du im letzten select da nach 2 Spalten, von denen eine gar nicht im Select-Teil steht? (vorgang).

Vermutlich ist das, was Du willst, auf folgendes Beispiel reduzierbar:

Code:
test=# create table vorgang (id int primary key, name text);
CREATE TABLE
test=*# create table detail(vorgang int references vorgang, wert int);
CREATE TABLE
test=*# insert into vorgang values (1, 'vorgang 1');
INSERT 0 1
test=*# insert into vorgang values (2, 'vorgang 2');
INSERT 0 1
test=*# insert into detail values (1, 10);
INSERT 0 1
test=*# insert into detail values (1, 20);
INSERT 0 1
test=*# insert into detail values (2, 20);
INSERT 0 1
test=*# insert into detail values (2, 50);
INSERT 0 1
test=*# select * from vorgang ;
 id |  name   
----+-----------
  1 | vorgang 1
  2 | vorgang 2
(2 rows)

test=*# select * from detail ;
 vorgang | wert
---------+------
  1 |  10
  1 |  20
  2 |  20
  2 |  50
(4 rows)

test=*# select v.name, sum(d.wert) from vorgang v left join detail d on v.id=d.vorgang group by v.name;
  name  | sum
-----------+-----
 vorgang 1 |  30
 vorgang 2 |  70
(2 rows)
 
Nein, leider nicht.

Grob kann man sagen ich habe folgende Basistabellen:
basis.PNG


Daher muss ich ja beide Tabellen erst einmal auf je EINE Vorgangsdatenzeile reduzieren/werte summieren, sprich Ergebnis muss:

gruppiert.PNG


Ziel soll aber sein, das er mir nun insgesamt folgendes auswirft:

ziel.PNG
 
Zuletzt bearbeitet:
Code:
test=*# select * from haushalt ;
 vorgang | betrag | mwst
---------+--------+------
  1 |  15 |  4
  1 |  7 |  2
  2 |  20 |  4
  3 |  5 |  1
(4 rows)

test=*# select * from kostenrechnung ;
 vorgang | brutto
---------+--------
  1 |  21
  2 |  11
  2 |  9
  3 |  5
(4 rows)

test=*# select * from (select vorgang, sum(betrag) betrag, sum(mwst) mwst from haushalt group by vorgang) h left join (select vorgang, sum(brutto) from kostenrechnung group by vorgang) k using (vorgang);
 vorgang | betrag | mwst | sum
---------+--------+------+-----
  1 |  22 |  6 |  21
  3 |  5 |  1 |  5
  2 |  20 |  4 |  20
(3 rows)

test=*#
 
Entschuldige für meinen vorherigen unleserlichen Post. Wobei du doch alles erkennen konntest, während ich es leserlicher dargestellt habe.

Ja, das sieht schon mal ganz anders aus, als Versuche, die ich unternommen habe :))) Ich werde es mal testen.
Schon mal jetzt ganz ganz herzlichen Dank !!!

Vlt hab ich das dann endlich auch mal verstanden. Habe nämlich einiges, was so zukünftig besser zu bearbeiten wäre, ohne mit temporären Zwischentabellen zu arbeiten.

Danke !!!
 
Im SQL Management Studio bietet sich auch die Ausgabe als Text an um Select-Ergebnisse zu posten. Zusätzlich zum Code, dann kann man das schon eher mal kopieren und umstellen.
 
Btw.:

man kann das lesbarer gestalten, mittels WITH-Syntax. Das kann auch M$SQL.

Code:
test=*# with h as (select vorgang, sum(betrag) betrag, sum(mwst) mwst from haushalt group by vorgang), k as (select vorgang, sum(brutto) from kostenrechnung group by vorgang) select * from h left join k using (vorgang);
 vorgang | betrag | mwst | sum
---------+--------+------+-----
  1 |  22 |  6 |  21
  3 |  5 |  1 |  5
  2 |  20 |  4 |  20
(3 rows)
 
hmm, irgendwie hat er ein Problem mit dem "using". Kennt MSSQL es nicht?
Was besagt der letzte Using-Parameter?


danke bzgl. der Darstellungstipps!
 
Werbung:
ok also müsste es so lauten:

Code:
select * from (select vorgang, sum(betrag) betrag, sum(mwst) mwst from haushalt group by vorgang) h left join (select vorgang, sum(brutto) from kostenrechnung group by vorgang) k on k.vorgang = h.vorgang

Ich musste noch für die Spalte in "k" auch noch einen Spaltennamen vergeben, nun klappt es richtig gut !!

Ganz herzlichen Dank! Das bietet so viele neue tolle Möglichkeiten :)

Macht euch einen schönen Feierabend und herzliche Grüße

Marco
 
Zurück
Oben