UNION Abfrage anpassen

wuumbs

Benutzer
Beiträge
5
Hallo zusammen,

mir liegen zwei Tabellen vor, die ich über einen UNION Befehl verbinden möchte.
Bei Tabelle1 handelt es sich um Kaufzahlen bestimmter Produkte bis zum heutigen Tag. Tabelle2 zeigt Kaufprognosen der Zukunft.

Tabelle 1:

Jahr Produkt Käufe
2016 Hose 1
2017 Hose 6
2018 Hose 2

Tabelle 1:

Jahr Produkt Prognose
2018 Hose 6
2019 Hose 9
2020 Hose 10
2021 Hose 14

Nun verwende ich folgenden Befehl:

select *
Code:
select * from Tabelle1
UNION
select * from Tabelle2

Folgendes Ergebnis erhalte ich:

Jahr Produkt Käufe
2016 Hose 1
2017 Hose 6
2018 Hose 2
2018 Hose 6
2019 Hose 9
2020 Hose 10
2021 Hose 14

Was ich allerdings gerne hätte wäre folgendes:

Jahr Produkt Käufe Prognose
2016 Hose 1 0
2017 Hose 6 0
2018 Hose 2 6
2019 Hose 9 0
2020 Hose 10 0
2021 Hose 14 0

Ein UNION Befehl ist für diese Ausgabe wahrscheinlich nicht der richtige Befehl. Bin allerdings ratlos wie ich die gewünschte Ausgabe erhalten kann.

Über Eure Hilfe freue ich mich sehr!

Viele Grüße,
wuumbs
 
Werbung:
Code:
test=*# select * from wuumbs1;
 jahr | produkt | kaeufe
------+---------+--------
 2016 | hose  |  1
 2017 | hose  |  6
 2018 | hose  |  2
(3 rows)

test=*# select * from wuumbs2;
 jahr | produkt | kaeufe
------+---------+--------
 2018 | hose  |  6
 2019 | hose  |  9
 2020 | hose  |  10
 2021 | hose  |  14
(4 rows)

test=*# select jahr, produkt, sum(case when prognose > 1 then 0 else kaeufe end) as kaeufe, sum(case when prognose > 1 then kaeufe else 0 end) as prognose from (select *, row_number() over (partition by produkt, jahr order by jahr) as prognose from (select * from wuumbs1 union all select * from wuumbs2) foo) bar group by jahr, produkt order by jahr;
 jahr | produkt | kaeufe | prognose
------+---------+--------+----------
 2016 | hose  |  1 |  0
 2017 | hose  |  6 |  0
 2018 | hose  |  2 |  6
 2019 | hose  |  9 |  0
 2020 | hose  |  10 |  0
 2021 | hose  |  14 |  0
(6 rows)

test=*#
[/cod]
 
Danke für die schnelle Hilfe! Ich versuche gerade den Code nachzuvollziehen, tue mich leider als Anfänger noch etwas schwer.

Mir ist leider aufgefallen, dass ich bei der Thread Erstellung einen Fehler gemacht habe. Der Datensatz, der am Ende herauskommen soll, sollte wie folgt aussehen:

jahr | produkt | kaeufe | prognose
------+---------+--------+----------
2016 | hose | 1 | 0
2017 | hose | 6 | 0
2018 | hose | 2 | 6
2019 | hose | 0 | 9
2020 | hose | 0 | 10
2021 | hose | 0| 14

Ich möchte nämlich vergleichen ob die aktuelle Prognose sich bewahrheitet oder eben nicht. Für das laufende Jahr 2018 gibt es bereits Käufe, für die Zukunft liegen diese natürlich noch bei 0.

Könntest du mir vielleicht noch einen Tipp geben wie ich den Code anpassen muss, damit das oben dargestellte herauskommt?
 
Na gut, weil Du es bist:

Code:
test=*# select jahr, produkt, sum(kaeufe) as kaeufe, sum(prognose) as prognose from (select jahr, produkt, kaeufe, 0::int as prognose from wuumbs1 union all select jahr, produkt, 0, kaeufe from wuumbs2) foo group by jahr, produkt order by jahr, produkt;
 jahr | produkt | kaeufe | prognose
------+---------+--------+----------
 2016 | hose  |  1 |  0
 2017 | hose  |  6 |  0
 2018 | hose  |  2 |  6
 2019 | hose  |  0 |  9
 2020 | hose  |  0 |  10
 2021 | hose  |  0 |  14
(6 rows)

test=*#
 
Danke! Funktioniert super und ich kann es mittlerweile auch gut nachvollziehen.

Zur Visualisierung habe ich gerade versucht mit Visual Studio 2012 einen Report zu entwerfen und mir die erstellte Tabelle als doppeltes Balkendiagramm (X-Achse: Jahre; Y-Achse: Anzahl Prognose/Käufe) auszugeben.
Bei der Erstellung eines Datasets gab es keine Probleme. Im Query Designer wird alles korrekt dargestellt.

Wenn ich nun ein Diagramm mit dem Dataset verbinde und alles einstelle spuckt er mir letztlich einen Fehler aus.

"The Value expression used in textrun ‘Prognose.Paragraphs[0].TextRuns[0]’ returned a data type that is not valid. "

Im Balkendiagramm zeigt er lediglich die Jahre 2016, 2017 und 2018 an und auch nur die Käufe und keine Prognose mehr.

Habt ihr eine Idee woran das liegen könnte?
 
Mit Visual Studio kenne ich mich nicht aus aber du kannst mal die Datentypen aller Spalten explizit angeben. Auch die 0 kannst du mit cast(0 AS INT) austauschen, das ist im Prinzip das was akretschmer mit 0::int gemacht hat. Wenn das nicht hilft, vielleicht das Select in einer View anlegen und mit Visual Studio darauf zugreifen.
 
Werbung:
Zurück
Oben