Announcement

Collapse
No announcement yet.

Nullwert ausgeben mit unterabfrage

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

  • Nullwert ausgeben mit unterabfrage

    Hallo zusammen,

    möchte bei einer Unterabfrage falls nichts zurückgegeben wird eine 0 in der Tabelle anzeigen.
    Die Abfrage sieht folgendermaßen aus was noch nicht richtig funktioniert..
    Falls in der Unterabfrage nichts zurückgegeben wird soll eine "null" geschrieben werden.
    Das Ganze soll nach date,shift,machine gruppiert werden.
    Ich habe das ein mal hinbekommen dass in der 4 Spalte "null" in den leeren Zeile in den leeren Feldern steht aber sonst steht überall die gleiche Zahl.
    Die Spalte ist nicht gruppiert sondern nur summiert.
    Hat jemand einen Tip für mich.
    Hier mein Ansatz:

    Code:
    [select date , shift, machine,sum(minuten) as Gesamtzeit
    Code:
    (select COALESCE (sum(minuten),0) from Tabelle1 where level1 in ('Downtime')
    Code:
    from Tabelle1 group by date,shift,machine
    Hat jemand einen Tip

    Gruss














  • #2
    case
    when (select sum(minuten)from Tabelle1 where level1 in ('Downtime')=0 then
    NULL
    else
    (select sum(minuten) from Tabelle1 where level1 in ('Downtime')
    end
    Zuletzt editiert von Christian Marquardt; 06.02.2020, 09:16.
    Christian

    Comment


    • #3
      in Oracle geht am einfachsten in dem Fall nvl(), es definiert einen Ersatzwert, falls die Spalte NULL liefert.
      also
      PHP Code:
      select nvl(meineSpalte,0from meineTabelle 
      Das kann man dann natürlich auch summieren.

      Auch nett in Oracle, für mehrdeutige Fälle, ist decode(), ein kompaktes case .. when.
      Gruß, defo

      Comment


      • #4
        Hallo,
        leider scheitere ich noch, hier noch paar Angaben wie es aussehen soll.

        Die Tabelle sieht so aus:
        PHP Code:
              DAY           SHIFT   LINE         STATUS          STATUS2          TIME
         06.02.2020      FS        SMT1        downtime           setup              20
         06.02.2020      FS        SMT1        downtime           technic            100
         06.02.2020      FS        SMT1        regular                               30
         06.02.2020      SS        SMT1        regular                               40
         06.02.2020      SS        SMT1        downtime           technic            70
         05.02.2020      NS        SMT2        regular                               240 



        PHP Code:
        select day,shift,line,sum(time) as Gesamtzeit,
        (
        select nvl(sum(time),0from test2 where status in ('downtime')) as Stillstand
        from test2 group by day
        ,shift,line 


        Bekomme folgende Ausgabe mit meinem SELECT was nicht ganz stimmt:

        PHP Code:
        DAY            SHIFT              LINE                 GESAMTZEIT                  STILLSTAND
        06.02.2020        SS                SMT1                   110                         190
        06.02.2020        FS                SMT1                   150                         190
        05.02.2020        NS                SMT2                   240                         190 
        Ich möchte den Select so erhalten:
        PHP Code:
        DAY            SHIFT              LINE                 GESAMTZEIT                  STILLSTAND
        06.02.2020        SS                SMT1                   110                         70
        06.02.2020        FS                SMT1                   150                         120
        05.02.2020        NS                SMT2                   240                         0 


        Kann es sein dass ich dafür ein
        PHP Code:
        left join 
        benötige?
        Gruss

        Comment


        • #5
          PHP Code:
          select day,shift,line,sum(time) as Gesamtzeit,
          (
          select nvl(sum(time),0from test2 sub where status in (downtime) and sub.shift=t.shift) as Stillstand
          from test2 t group by day
          ,shift,line 
          Ein join dient zum verbinden von 2 Tabellen
          https://www.codeproject.com/Articles...n-of-SQL-Joins
          Christian

          Comment


          • #6
            Habe es so gelöst.



            PHP Code:
            select a.day,a.shift,a.line,sum(time) as Gesamtzeitnvl(b.stillstand,0) as Stillstand
            from test2 a left join 
            (select day,shift,line ,sum(time) as stillstand from test2   where status in ('downtime'group by day,shift,lineb
            on a
            .day b.day
            and a.shift b.shift
            and a.line b.line
            group by a
            .day,a.shift,a.line,b.stillstand 




            PHP Code:
                DAY              SHIFT          LINE             GESAMTZEIT                   STILLSTAND
            06.02.2020         SS             SMT1                   110                          70
            06.02.2020         FS             SMT1                   150                          120
            05.02.2020         NS             SMT2                   240                          0 

            Comment


            • #7
              Originally posted by Christian Marquardt View Post
              PHP Code:
              select day,shift,line,sum(time) as Gesamtzeit,
              (
              select nvl(sum(time),0from test2 sub where status in (downtime) and sub.shift=t.shift) as Stillstand
              from test2 t group by day
              ,shift,line 
              Ein join dient zum verbinden von 2 Tabellen
              https://www.codeproject.com/Articles...n-of-SQL-Joins
              Die Lösung funktioniert genau so sehe ich und ist schöner.
              Die sub Funktion kannte ich noch nicht.


              Danke

              Comment


              • #8
                Das ist keine Funktion, sondern genau wie "as Stillstand" ein Alias für eine Tabelle.
                Oracle möchte unbedingt, das man bei Spalten AS hinschreibt. Bei Tabellen kann man sich das sparen

                Hier sind die Aliase t und sub
                from test2 AS t
                from test2 AS sub

                wäre auch gegangen. Damit kannst du dann beim where genau spezifizieren aus welchem Teil des SQl du gerade den Wert willst. Der Wert aus der Subquery wird mit dem Wert aus der Hauptquery verglichen
                Christian

                Comment


                • #9
                  Habe es verstanden , danke.

                  Comment


                  • #10
                    Originally posted by wiesel25 View Post
                    Die Lösung funktioniert genau so sehe ich und ist schöner.
                    Das sehe ich nicht so. Kompakter Code wirkt sicher übersichtlicher, der join im Subquery spart die Ausgabe der Join Schlüssel, elegant geschrieben, ja. Aber hier (immer bei diesen "inline" joins) sehe ich ein Problem:
                    Das Subselect in der Form kann ein Performance Defizit gegen über der Variante mit äußerem Join bedeuten.

                    Das ist natürlich auch immer abhängig von Mengengerüst und Indizierung, aber man sollte zumindest mal testen, wie sich die beiden Varianten verhalten.

                    Zuletzt bleibt zu sagen, dass die kompakte Variante 2 Joins schlabbert, zumindest im Vergleich zu der "hab's so gelöst" Variante.
                    Gruß, defo

                    Comment

                    Working...
                    X