Announcement

Collapse
No announcement yet.

Union mit 2 Tabellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Union mit 2 Tabellen

    Hallo,
    ich habe folgendes Problem...

    2 Tabellen sollen in einer Tabelle angezeigt werden


    Tabelle 1

    ID | Name | Arbeitsstunden


    Tabelle 2

    ID | Name | Krank | Urlaub



    in beiden Abfragen können die gleichen "Namen" vorkommen müßen aber nicht

    in beiden select Statements werden die Spalten Arbeitsstunden Krank Urlaub aufsummiert, in der Form 'max(decode(...))

    beide select Statements funktionieren wie gewünscht, nur wie bekomme ich die beiden Ergebnisstabellen nun in eine gemeinsame Tabelle

    schätze das dies mit UNION oder UNION ALL funktioniert nur wie?!?

    da ich in beiden selects mit 'group by' und 'order by' arbeite scheint das durcheinander zu geraten


    zur Zeit sieht meine Abfrage so aus

    Code:
    select MitarbeiterID,
    MitarbeiterName,
    Vorname, Gesundheit, Marketing, Organisation, 0 Urlaub, 0 Krank 
    from 
      (
        select ...
    group by...
      ) 
    
    union 
    
    select MitarbeiterID,
    MitarbeiterName,
    Vorname, 0 Gesundheit, 0 Marketing, 0 Organisation, Urlaub, Krank 
    from
       (
        select ...
    group by...
      )

    wobei Gesundheit Marketing Organistation Urlaub und Krank mit max(decode(...)) ermittelt werden

    Fehlermeldung
    in der Zeile in der das 'UNION' steht
    SQL-Fehler: ORA-00979: Kein GROUP BY-Ausdruck
    00979. 00000 - "not a GROUP BY expression"
    *Cause:
    *Action:
    Zuletzt editiert von reaver-tj; 30.12.2009, 10:54.

  • #2
    Die Meldung hat nichts mit dem UNION zu tun, sondern damit, dass Du eine Spalte, die nicht in einer Aggregatsfunktion steht nicht im GROUP BY stehen hast.

    Dim

    PS: Der Unterschied zwischen UNION und UNION ALL ist der, das UNION die Ergebnismenge zusätzlich noch einmal einmal eindampft und doppelte Zeilen entfernt. Solltest Du das nicht brauchen, würde ich UNION ALL verwenden, da dies deutlich schneller geht.
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment


    • #3
      die selects in den Klammer () funktionieren alleine, nur in Verbindung mit UNION nicht, dann erscheint diese Fehlermeldung

      daher verstehe ich nicht warum dort ein group by fehlt ...

      Comment


      • #4
        Kannst Du mal das komplette SQL per C&P reinkopieren?

        Dim
        Zitat Tom Kyte:
        I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

        Comment


        • #5
          Code:
          select MitarbeiterOID,
          MitarbeiterName,
          Vorname,
          orgoid,
          IFM, KFM, PFM, TFM, EDL, Gesundheit, Marketing, Organisation, 
          MultiUtility, OperativProduktiv, FunktioninPerson, 0 Urlaub, 0 Krank from (
                  select a.moid as MitarbeiterOID,
                  a.MitarbeiterNameA as MitarbeiterName,
                  a.VornameA as Vorname,
                  a.orgoid as orgoid,
                  max(decode(a.ArtikelgruppeOID,'...',a.Stunden)) IFM,
                  max(decode(a.ArtikelgruppeOID,'...',a.Stunden)) KFM,
                  max(decode(a.ArtikelgruppeOID,'...',a.Stunden)) PFM,
                  max(decode(a.ArtikelgruppeOID,'...',a.Stunden)) TFM,
                  max(decode(a.ArtikelgruppeOID,'...',a.Stunden)) EDL,
                  max(decode(a.ArtikelgruppeOID,'...',a.Stunden)) Gesundheit,
                  max(decode(a.ArtikelgruppeOID,'...',a.Stunden)) Marketing,
                  max(decode(a.ArtikelgruppeOID,'...',a.Stunden)) Organisation,
                  max(decode(a.ArtikelgruppeOID,'...',a.Stunden)) MultiUtility,
                  max(decode(a.ArtikelgruppeOID,'...',a.Stunden)) OperativProduktiv,
                  max(decode(a.ArtikelgruppeOID,'...',a.Stunden)) FunktioninPerson
                  --:vondatum as vondat,
                  --:bisdatum as bisdat
                  from (select m.oid as moid, 
                        m.name as MitarbeiterNameA,
                        m.vname as VornameA,
                          artg.name as ArtikelGruppe,
                          artg.oid as ArtikelgruppeOID,
                          org.oid as orgoid,
                          Sum(DATEDIFF('hh',b.vonzeit,b.biszeit)) as Stunden
                        from mitarbeiter m
                        left outer join buchung b on b.mitarbeiter = m.oid 
                        left outer join auftragposition ap on b.auftragposition = ap.oid
                        left outer join orgaeinheit org on org.oid = ap.orgaeinheit
                        left outer join artikel art on art.oid = ap.artikel
                        left outer join artikelgruppe artg on artg.oid = art.artikelgruppe      
                        where b.vonzeit between to_date('01.12.2009','dd.mm.yyyy') and to_date('30.12.2009','dd.mm.yyyy')
                        and org.oid='...'
                        group by artg.name,
                          m.name,
                          m.vname,
                          artg.oid,
                          m.oid,
                          org.oid
                        order by m.name) a
                  group by a.MitarbeiterNameA,a.VornameA, a.moid, a.orgoid
          ) 
          
          union 
          
          select MitarbeiterOID,
          MitarbeiterName,
          Vorname,
          orgoid,
          0 IFM, 0 KFM, 0 PFM, 0 TFM, 0 EDL, 0 Gesundheit, 0 Marketing, 0 Organisation, 
          0 MultiUtility, 0 OperativProduktiv, 0 FunktioninPerson, Urlaub, Krank from(
                    select a.moid as MitarbeiterOID,
                    a.MitarbeiterNameB as MitarbeiterName,
                    a.Vorname as Vorname,
                    a.orgoid as orgoid,
                    max(decode(a.abwaOID,'...',a.SonStunden)) Urlaub,
                    max(decode(a.abwaOID,'...',a.SonStunden)) Krank
                    from (select m.oid as moid, 
                          m.name as MitarbeiterNameB,
                          m.vname as Vorname,
                          --  org.name,
                            abwa.name as Sonstiges,
                            abwa.oid as abwaOID,
                            m.orgaeinheit as orgoid,
                            SUM(abw.anzstunden) as SonStunden
                          --  b.vonzeit,
                          --  b.biszeit,
                            --Sum(DATEDIFF('hh',b.vonzeit,b.biszeit)) as Stunden
                          from mitarbeiter m
                          left outer join abwesenheit abw on abw.mitarbeiter = m.oid
                          left outer join abwesenheitart abwa on abw.abwesenheitart = abwa.oid 
                          
                          where abw.tagdat between to_date('01.12.2009','dd.mm.yyyy') and to_date('30.12.2009','dd.mm.yyyy') 
                            and (abwa.oid = '...' or abwa.oid = '...') 
                            and m.orgaeinheit = '...'
                          group by 
                            m.name,
                            m.vname,
                            m.oid,
                            abwa.name,
                            abwa.oid,
                            m.orgaeinheit
                            --abw.anzstunden
                          order by m.name, m.vname) a
                      group by a.MitarbeiterNameB,
                        a.Vorname, 
                        a.orgoid
                      order by a.MitarbeiterNameB
          )
          Fehlermeldung
          Fehler bei Befehlszeile:49 Spalte:7
          Fehlerbericht:
          SQL-Fehler: ORA-00979: Kein GROUP BY-Ausdruck
          00979. 00000 - "not a GROUP BY expression"
          *Cause:
          *Action:

          Comment


          • #6
            die selects in den Klammer () funktionieren alleine,
            Glaub ich dir nicht:
            Code:
            select --4 Spalten ohne Aggregatsfunktion
            	  a.moid as MitarbeiterOID,
                      a.MitarbeiterNameB as MitarbeiterName,
                      a.Vorname as Vorname,
                      a.orgoid as orgoid,
                      max(decode(a.abwaOID,'...',a.SonStunden)) Urlaub,
                      max(decode(a.abwaOID,'...',a.SonStunden)) Krank
                      from (...)a
            group by --3 Spalten im GROUP BY
                          a.MitarbeiterNameB,
                          a.Vorname, 
                          a.orgoid
            Es fehlt a.moid im GROUP BY.
            Des weiteren reicht ein ORDER BY im übergeordneten Select vollkommen aus. Es bringt nichts (außer längere Laufzeit) die Zwischenmengen zig mal durchsortieren zu lassen.

            Dim
            Zitat Tom Kyte:
            I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

            Comment


            • #7
              kleiner fehler große Wirkung

              jetzt gehts

              irgendwie ist beim zusammenfügen das 'group by a.moid' verloren gegangen oder ich habs schlichtweg vergessen als ich a.moid zusätzlich selektiert habe

              danke danke

              Comment

              Working...
              X