Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

UNION Abfrage anpassen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von wuumbs, 7 Februar 2018.

  1. wuumbs

    wuumbs Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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]
     
  3. wuumbs

    wuumbs Benutzer

    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?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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=*#
    
     
    wuumbs gefällt das.
  5. ukulele

    ukulele Datenbank-Guru

    Und ::int läßt du einfach weg, das sollte gehen.
     
    wuumbs gefällt das.
  6. wuumbs

    wuumbs Benutzer

    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?
     
  7. ukulele

    ukulele Datenbank-Guru

    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.
     
  8. wuumbs

    wuumbs Benutzer

    Es lag tatsächlich an den Datentypen. Nach der Änderung hat es funktioniert!

    Vielen Dank für Eure Hilfe
     
  9. ukulele

    ukulele Datenbank-Guru

    Nunja, das steht ja auch in der Fehlermeldung :)
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden