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

Sql-Abfrage: Union all

Dieses Thema im Forum "Oracle" wurde erstellt von MiZ__, 9 Januar 2017.

  1. MiZ__

    MiZ__ Benutzer

    Guten Tag miteinander

    Ich habe eine Frage betreffend einer Sql-Abfrage und zwar möchte ich einen Auftrag für eine bestimmte Buchungsperiode auswerten, wobei die auszuwertenden Daten sich in zwei verschiedenen Tabellen befinden.

    Habe nun nachfolgende Sql-Abfrage erstellt, welche aus 2 Selects besteht die mittels Union All miteinander verknüpft werden. Ich bin ziemlicher Neuling auf dem Sql-Gebiet und von daher gehe ich davon aus, dass meine Abfrage nicht die Ideal-Lösung darstellt..

    Ich muss nun jedesmal zweifach die Auftragsnummer sowie das Buchungsdatum eingeben (rot markiert).

    SELECT (CSP92020.P92AUFNR) Auftragsnummer,

    (CSP92020.P92TMNGI) Menge,

    (CSP92020.P92BUDAT) Buchungsdatum

    FROM CS2.CSP92020 CSP92020

    WHERE (CSP92020.P92AUFNR = '00015000')

    AND (CSP92020.P92BUDAT) BETWEEN '2011-01-01' AND '2016-12-31'

    UNION ALL

    SELECT CSP93020.P93AUFNR,

    CSP93020.P93ZEITI,

    CSP93020.P93BUDAT

    FROM CS2.CSP93020 CSP93020

    WHERE (CSP93020.P93AUFNR = '00015000')

    AND (CSP93020.P93BUDAT) BETWEEN '2011-01-01' AND '2016-12-31'

    Liesse sich die Abfrage nicht auch so erstellen, dass Auftrag bzw. Buchungsdatum nur 1x eingegeben werden müssen, quasi übergeordnet für beide Teil-Selects gelten?

    Besten Dank für eure Bemühungen,

    Freundlicher Gruss,
    MiZ
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Ja. Mache zuerst das UNION ALL und frage dann nach der Where-Condition.
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select * from (select 'a' as table, s from generate_series(1,10) s(s) union all select 'b', z from generate_series(1,5) z(z)) bla where s = 3 ;
     table | s
    -------+---
     a  | 3
     b  | 3
    (2 rows)
    
    test=*#
    
     
  4. MiZ__

    MiZ__ Benutzer

    Guten Morgen,
    Vielen Dank für die prompte Hilfe. Leider stehe ich gleichwohl an..

    Habe meine Abfrage nun umgestaltet und mich dabei auf die Auftragsnummer als Where-Condition beschränkt.

    SELECT *
    FROM
    (SELECT (CSP92020.P92AUFNR) Auftragsnummer,
    (CSP92020.P92TMNGI) Menge,
    (CSP92020.P92BUDAT) Buchungsdatum
    FROM CS2.CSP92020 CSP92020

    UNION ALL

    SELECT CSP93020.P93AUFNR,
    CSP93020.P93ZEITI,
    CSP93020.P93BUDAT
    FROM CS2.CSP93020 CSP93020)

    WHERE (CSP92020.P92AUFNR = CSP93020.P93AUFNR)
    AND (CSP92020.P92AUFNR = '00015000')

    Ergibt beim Auswerten jedoch eine Fehlermeldung.
    Könnt ihr mir hier weiterhelfen?

    Besten Dank und Gruss,
    MiZ__
     
  5. drdimitri

    drdimitri Datenbank-Guru

    Oracle kennt mehr als tausend Fehlermeldungen. Welche war's denn bei dir?
    Wieso joinst du in der WHERE Bedingung? Das ist nicht nötig.
     
    akretschmer gefällt das.
  6. MiZ__

    MiZ__ Benutzer

    Fehlermeldung lautet:
    Lookup Error
    ORA-00904: "CSP92020"."P92AUFNR": ungültiger Bezeichner

    Da die Auftragsnummer in den beiden Teil-Selects in unterschiedlichen Feldern hinterlegt ist (CSP93020.P93AUFNR bzw. CSP92020.P92AUFNR) und ich die Auftragsnummer in der WHERE Bedingung nur 1x eingeben möchte, wollte ich dies wie oben gezeigt bewerkstelligen.
    Scheint aber offensichtlich nicht die korrekte Lösung zu sein..

    Ich möchte die Auftragsnummer einmalig eingeben, so dass diese in die beiden Teil-Abfragen (in die Felder CSP93020.P93AUFNR bzw. CSP92020.P92AUFNR) übernommen wird.

    Aber vielleicht ist die Abfrage ja grundsätzlich falsch aufgebaut. Ich habe 2 Tabellen, CS2.CSP92020 mit den Lohnkosten, Mengen, Buchungsdatum pro Auftrag, CS2.CSP93020 mit den Materialkosten, Mengen, Buchungsdatum pro Auftrag.
    Nun möchte ich für einen bestimmen Auftrag alle Lohnkosten bzw. Materialkosten, deren Mengen und das jeweilige Buchungsdatum auswerten. Wobei in Spalte A die Lohn- bzw. Materialkosten, in Spalte B die Mengen und in Spalte C das Buchungsdatum stehen soll.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Die Spaltennamen nach so einer Union-Orgie richten sich nach den Namen der Salten in der ersten aufgeführten Tabelle.
     
  8. MiZ__

    MiZ__ Benutzer

    Lese ich da raus, dass meine Vorgehensweise mit der Union-Funktion nicht ganz der Ideallösung entspricht?

    Wie müsste ich so eine Abfrage dann gestalten, könnt ihr mir einen Hinweis hierzu geben?
    An und für sich habe ich ja eine korrekte Abfrage (siehe obersten Beitrag), diese ist nur umständlich, da ich die Auftragsnummer zweifach eingeben muss.
     
  9. akretschmer

    akretschmer Datenbank-Guru

    Nein. Um es mal zu zeigen:

    Code:
    test=# create table x(a int, b int);
    CREATE TABLE
    test=*# create table y(c int, d int);
    CREATE TABLE
    test=*# select a as m, b as n from x union all select c, d from y;
     m | n
    ---+---
    (0 Zeilen)
    
    Man beachte die Spaltennamen.
     
  10. MiZ__

    MiZ__ Benutzer

    Da ich die beiden Positionen "Lohnkosten" und "Materialkosten" in derselben Spalte ausweisen möchte, passt das Verwenden der Union-Funktion aber schon, oder? Die Spaltennamen stören mich nicht weiter, wenn ich Spalte A "Kosten" nenne, dann passt sie für Lohn- wie auch für Materialkosten.

    Mein ursprüngliches Problem mit der WHERE-Bedingung ist aber weiterhin ungeklärt, oder habe ich da was übersehen
    ? Ich bin froh, wenn ihr mir diesbezüglich nochmals ein wenig Hilfestellung geben könnt, da ich wie gesagt (und vermutlich unschwer erkennbar) ein ziemlicher Neuling auf dem sql-Gebiet bin.
     
  11. akretschmer

    akretschmer Datenbank-Guru

    Ja. #2 und #3.
     
  12. MiZ__

    MiZ__ Benutzer

    Ich steh an, auch mit deinen Hinweisen aus #3. Das Ganze ist mir irgendwie zu abstrakt.

    Du könntest nicht deine Hinweise ein bisschen konkreter auf meine Abfrage beziehen, dh. mit meinen Feld- bzw.Tabellennamen befüllen?

    Vielen Dank und schönen Abend,
     
  13. ukulele

    ukulele Datenbank-Guru

    Wenn ich das richtig sehe ist dein einziges Problem das die Spaltenanzahl oder das Spaltenformat deiner beiden Selects beim UNION ALL nicht übereinstimmen. Also SELECT * durch explizite Spaltennamen ersetzen, die Anzahl und das Format muss gleich sein.
     
  14. akretschmer

    akretschmer Datenbank-Guru


    Sollte etwa so sein:

    select * from (
    SELECT (CSP92020.P92AUFNR) Auftragsnummer,
    (CSP92020.P92TMNGI) Menge,
    (CSP92020.P92BUDAT) Buchungsdatum
    FROM CS2.CSP92020 CSP92020
    UNION ALL
    SELECT CSP93020.P93AUFNR,
    CSP93020.P93ZEITI,
    CSP93020.P93BUDAT
    FROM CS2.CSP93020 CSP93020
    )
    where Auftragsnummer = '00015000';


    Der erste Part in Deinem Where ist Unfug, im zweiten Teil greifst Du auf eine Spalte zu, die es nicht gibt, da Du dieser im Inneren einen anderen Namen gegeben hast.
     
  15. MiZ__

    MiZ__ Benutzer

    So klappts wunderbar:)
    Recht herzlichen Dank für die Geduld und Hilfsbereitschaft.

    Allen einen schönen Tag und Gruss,
    MiZ__
     
    akretschmer gefällt das.
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