Announcement

Collapse
No announcement yet.

LEFT JOIN Problem

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

  • LEFT JOIN Problem

    Hallo MySQL Freaks,
    Danke erstmal an alle die sich mit diesem Beitrag beschäftigen.

    Zum besseren Verständnis werde ich hier zuerst die Struktur von 2 Tabellen in Kurzform erläutern.

    Bsp: Tabelle1<BR>

    ID | Arbeiten <BR>
    1 | Produktion <BR>
    2 | Auftragsmangel <BR>
    3 | Reparatur <BR>
    4 | Umbau <BR>

    Bsp: Tabelle2 <BR>

    ID | Arbeit | MaschinenNr | Datum | Laufzeit <BR>
    1 | Produktion | 1 | 29.12.04 | 3 <BR>
    2 | Umbau | 1 | 29.12.04 | 4 <BR>
    3 | Produktion | 2 | 29.12.04 | 3 <BR>
    4 | Produktion | 3 | 29.12.04 | 5 <BR>
    5 | Reparatur | 3 | 29.12.04 | 3 <BR>
    6 | Umbau | 3 | 29.12.04 | 2 <BR>

    so nun zu meinem Problem:

    ich möchte alle Arbeiten aus Tabelle1 angezeigt bekommen auch wenn es in Tabelle 2 keine Einträge gibt.

    Mit folgender Abfrage habe ich es probiert aber es will nicht funktionieren.

    select A.Arbeiten, B.Maschine, B.Datum, <BR>
    SUM(B.Laufzeit) AS Gesamtlaufzeit,<BR>
    SUM(B.Laufzeit)/24 *100 AS Prozent

    FROM Tabelle1 AS A <BR>
    LEFT OUTER JOIN Tabelle2 as B
    on B.Datum = '2004.12.29' <BR>
    and A.Arbeiten = B.Arbeit <BR>

    GROUP BY B.Anlage,A.Arbeiten <BR>

    ORDER BY B.Anlage <BR>

    ich bekomme keine leeren Datensätze aus Tabelle2 angezeigt

    Vielleicht hat ja jemand eine Idee

    Vielen Dank

    Uwe

  • #2
    Hallo Uwe,

    probier mal ...on (B.Datum = '2004.12.29' or B.ID is null)...

    Gruß Fal
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk,

      die Idee und viele andere hatte ich auch schon.

      Wenn ich

      on (A.Arbeit = B.Arbeit<BR>
      and B.Datum = '2004.01.07'<BR>
      or B.ID = NULL)<BR>

      schreibe,werden 2 Leerzeilen am Anfang für Maschine 1 eingefügt.<BR>
      Es müßten aber für jede Maschine Leerzeilen
      eingefügt werden.

      Trotdem Dank

      Comment


      • #4
        Hallo Uwe, bin mir nicht ganz sicher ob ich
        100% verstanden habe was du als Resultat
        möchtest. Hab aber mal ein Beispiel gebastelt
        wie du das erreichst was ich denke das du
        möchtest.....

        Beispiel für SQLServer (sorry - hab leider
        keine Ahnung von MySQL) sollte aber nicht
        allzu schwer sein das anzupassen.

        Query arbeitet mit einem Cross Join - normalerweise Pfui aber manchmal auch ganz nützlich....

        Gruss Frank

        create table tbl_arbeiten (
        id int not null,
        Arbeiten varchar (50) not null,
        constraint pk_arbeiten primary key (id))
        go
        drop table tbl_jobs
        create table tbl_jobs (
        id int not null,
        arbeit varchar(50),
        maschinennr int not null,
        datum datetime not null,
        laufzeit int
        constraint pk_jobs primary key (id))
        go

        insert into tbl_arbeiten values (1,'Produktion')
        insert into tbl_arbeiten values (3,'Reparatur')
        insert into tbl_arbeiten values (4,'Umbau')
        insert into tbl_arbeiten values (2,'Auftragsmangel')
        go

        insert into tbl_jobs values (1,'Produktion',1,'2004-12-29',3)
        insert into tbl_jobs values (2,'Umbau',1,'2004-12-29',4)
        insert into tbl_jobs values (3,'Produktion',2,'2004-12-29',3)
        insert into tbl_jobs values (4,'Produktion',3,'2004-12-29',5)
        insert into tbl_jobs values (5,'Reparatur',3,'2004-12-29',3)
        insert into tbl_jobs values (6,'Umbau',3,'2004-12-29',2)
        go

        -- gewünschtes Resultset ???

        select distinct a.arbeiten ,
        b.maschinennr ,
        b.datum,
        (select sum(laufzeit)from tbl_jobs
        where maschinennr = b.maschinennr
        and datum = b.datum
        and arbeit = a.arbeiten) as gesamtlaufzeit,
        (select cast(laufzeit/24.0 * 100 as decimal(5,2)) from tbl_jobs
        where maschinennr = b.maschinennr
        and datum = b.datum
        and arbeit = a.arbeiten) as prozent
        from tbl_arbeiten a, tbl_jobs b
        where b.datum = '2004-12-29'
        order by maschinennr, arbeite

        Comment


        • #5
          Ich hab jetzt deine Frage nochmal gelesen und bin mir nicht mehr ganz sicher was du eigentlich erreichen möchtest. Am besten du listest mal auf, wie dein Wunschergebnis aussehen sollte.

          Gruß Fal
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Hallo,<br>ich denke, er möchte, dass alle Bereiche aus Tabelle1 in einem Ergebnis dargestellt werden mit der Auslastung in % wobei aber alle Einzeleinträge dargestellt werden sollen.<br>Ich glaube nicht, dass dies in einer normalen zweidimensionalen Tabelle geht, da einerseits die Summe und andererseits die gesammten Einträge dargestellt werden sollen.<br>@Uwe, ist es nicht möglich, die Aufgabe zu teilen, so dass zum einen die Auslastung als Summe in % als Ergebnis kommt und zum anderen die Einzelaufträge gelistet werden?<br>Michae

            Comment


            • #7
              Erstmal Danke an alle.

              Mein Wunschergebnis

              Arbeit |MaschinenNr| Datum | Laufzeit | Prozent |<BR>
              Produktion | 1 |29.12.04| 3 | 15 |<BR>
              Auftragsmangel | 1 |29.12.04| 0 | 0 |<BR>
              Reparatur | 1 |29.12.04| 0 | 0 |<BR>
              Umbau | 1 |29.12.04| 4 | 20 |<BR>
              Produktion | 2 |29.12.04| 3 | 15 |<BR>
              Auftragsmangel | 2 |29.12.04| 0 | 0 |<BR>
              Reparatur | 2 |29.12.04| 0 | 0 |<BR>
              Umbau | 2 |29.12.04| 0 | 0 |<BR>
              Produktion | 3 |29.12.04| 3 | 25 |<BR>
              Auftragsmangel | 3 |29.12.04| 0 | 0 |<BR>
              Reparatur | 3 |29.12.04| 3 | 15 |<BR>
              Umbau | 3 |29.12.04| 3 | 15 |<BR>
              <BR>

              ich habe mir die Prozentzahlen natürlich nur ausgedacht.

              Warum ich diese Darstellung brauche hat den Grund das ich die Daten in einem Stapeldiagramm
              anzeigen möchte.
              Habe ich von "Maschine 1" z.B. für Auftragmangel und Reparatur keinen 0 Wert, wird im Diagramm der Wert 20% für Auftragsmangel eingesetzt obwohl er bei Umbau steht.

              Hoffe ich habe es jetzt nicht noch komplizierter gemacht.

              Uw

              Comment


              • #8
                Hi,

                auf der Suche nach so was ähnlichem bin ich jetzt hier gelandet. Ich habe ein Beispiel, wie das geht (allerdings Interbase) :

                <PRE>SELECT A.*,L.* FROM LAGER L RIGHT OUTER JOIN ART A ON (L.ID_ART = A.ID) WHERE (A.NR >= 1600)
                and (A.NR <= 7162)
                </PRE>

                Hierbei geht es darum, den Lagerbestand aufzulisten und zwar auch bei Artikeln, wo in der Lager-Table kein Datensatz drin ist, dann eben als 0. So wie ich das sehe, steht das RIGHT OUTER zu deutsch für "rechts außer Acht lassen" denn mit LEFT OUTER kommt dasselbe Ergebnis zustande, sofern ich das A.* und L.* vertausche.

                Wenn das so stimmt, dann dürfte es sich leicht selber verwenden lassen. Aber vorerst ohne Gewähr

                Comment


                • #9
                  Hallo Michael,

                  Dein gewünschtes Ergebnis kannst du (nach meinen SQL-Kenntnissen) mit deinem DB-Model nicht mit einem einfachen OUTER-JOIN (egal ob links oder rechts) lösen, da du ja ZWEI outer-Bedingungen (Arbeiten UND Maschine) hast.
                  Mein Ansatz wäre: Eine dritte Tabelle mit den verfügbaren Maschinen anlegen, die Maschine-Tabelle mit der Arbeiten-Tabelle in einer View über ein Kreuzprodukt verbinden (also OHNE Join) und dann diese View mittels OUTER-Join mit Tabelle2 verknüpfen.<pre>
                  select view1.arbeiten, view1.maschinennr, tab2.datum, sum(tab2.laufzeit) gesamtlaufzeit, sum(tab2.laufzeit)/24*100 prozent
                  from
                  (select tab1.arbeiten, tab3.maschinennr from tabelle1 tab1,
                  tabelle3 tab3) view1,
                  tabelle2 tab2
                  where view1.arbeiten = tab2.arbeit(+)
                  and view1.maschinennr = tab2.maschinennr(+)
                  and (tab2.datum = '29.12.2004' or tab2.id is null)
                  group by view1.arbeiten, view1.maschinennr, tab2.datum</pre>
                  Das ist jetzt zwar ORACLE-Syntax, sollte sich aber in einen "normalen" Join übersetzen lassen.

                  Gruß Fal
                  Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                  Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                  Comment

                  Working...
                  X