Announcement

Collapse
No announcement yet.

Problem mit group by und having

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

  • Problem mit group by und having

    Hallo zusammen.
    Ich hab folgenden Code
    Code:
    insert into @table SELECT Eintrag from Table where Volume > 0 group by Eintrag having count(Volume) < (select MinimumAmount from Settings) order by Eintrag
    
    select * from @table p inner join Table on p.Eintrag=Table.Eintrag where Table.Volume = 0
    Man kann es sich so vorstellen. Es gibt ein Lager mit Flaschen (Eintrag). Es gibt mehrere verschiedene Typen von Flaschen. Ein Typ kann auch mehrmals vorkommen. In meinem Fall gibt es für jeden Typ 8 Flaschen. Ich kann jeder Flasche ein Volumen entnehmen. Irgendwann sind ein paar Flaschen leer. Ich möchte aber darauf hingewiesen werden, wenn zb nur noch eine Flasche eines bestimmten Typs da ist, bei der etwas drin ist (MinimumAmount).
    Der obige Code funktioniert wunderbar, aber sobald wirklich mal alle Flaschen leer sind, dann geht es nicht mehr, da es dann diese Flaschentypen weglässt, die komplett fehlen.
    Der Gedanke war halt. Zähl mir mal alle Flaschen mit Volumen und prüfe, ob es weniger sind, als die Mindestmenge. Wenn aber keine Flasche eines Typs ein Volumen hat, dann kann es diesen Typ nicht zählen und er sagt mir, dieser Typ ist ausreichend da.
    Versteht ihr, was ich meine? Wie kann ich die Abfrage so abändern, dass es auch solche Fälle abdeckt?

    Vielen Dank schonmal
    Stefan

  • #2
    Oder besser formuliert.

    Ich habe folgende Tabelle:

    Eintrag Volumen
    A 800
    A 0
    B 0
    B 0
    C 500
    C 0


    Ich möchte jetzt alle Einträge haben, die weniger als einen Eintrag in der Volumenspalte haben. Also die Abfrage soll mir B liefern.

    Comment


    • #3
      Die where-Klausel einfach noch ergänzen:
      ... having (count(Volume) < (select MinimumAmount from Settings) ) or (sum(Volume) = 0) ...

      <ungetestet>

      bye,
      Helmut

      Comment


      • #4
        Danke erstmal für den Tipp.
        Klappt aber irgendwie trotzdem nicht. Er ignoriert trotzdem die Spalten mit den komplett leeren Einträgen.
        Es müsste doch bei so einem "einfachen" Problem doch eine einfachere Lösung geben, als komplexe group und having Abfragen...

        Comment


        • #5
          Ich denke die Ergänzung kann nicht klappen, da durch das where Volume > 0 eigentlich schon alle Felder rausfliegen, bei denen es kein Volume gibt.

          Comment


          • #6
            Ich habe es mal so probiert.
            Code:
            select Eintrag, count(Volume) from Table group by Eintrag having count(Volume) <= (select MinimumAmount from Settings) or sum(Volume)=0 order by Eintrag
            Aber count(Volume) ist bei mir da immer 1 mehr als erwartet. Also im obigen Beispiel bei A 2, B 1 und bei C 2

            Comment


            • #7
              Hallo,
              Originally posted by KPhoenix View Post
              Oder besser formuliert.

              Ich habe folgende Tabelle:

              Eintrag Volumen
              A 800
              A 0
              B 0
              B 0
              C 500
              C 0


              Ich möchte jetzt alle Einträge haben, die weniger als einen Eintrag in der Volumenspalte haben. Also die Abfrage soll mir B liefern.
              Also B hat hier nicht weniger als einen Eintrag, sondern Mehr - nämlich genau ZWEI! Wenn du die SUMME der Volumen meinst, dann mußt du in deinen Abfragen natürlich auch mit SUM() die Summe ermitteln und nicht mit COUNT() die Datensätze zählen. COUNT() lässt bei der Zählung lediglich DS aus, die NULL sind. Aber Null und numerisch 0 sind zwei unterschiedliche Dinge!

              Gruß Falk
              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


              • #8
                Es ist etwas komplizierter. Es geht ja nicht darum, Einträge zu finden, bei denen alle Volumen 0 sind, sondern bei denen weniger als ein vorgegebener Wert vorhanden sind. Also gibt mir alle Einträge, bei denen es weniger als 1, 2, etc gibt, dessen Volumenwert nicht 0 ist. Bei 1 muss mir die Ausgabe B liefern. Bei 2 muss mir die Ausgabe A, B und C liefern. Hab schon alles mögliche probiert, aber ich verzweifle daran.

                Comment


                • #9
                  Habe da erst den ersten Teil des WHERE mit dem ... where Volume > 0 ... glatt übersehen, sorry.

                  Aber jetzt wundert mich, dass du bei deinen Beispieldaten bei B eine 1 rauskriegst, da habe ich eine 2 wie bei allen anderen, da ja jede Einheit 2 x vorkommt. Für die Anzahl voller Flaschen ist das ungeeignet (da count(feld) auf NULL/nicht NULL prüft), probiere mal stattdessen sowas:

                  select Eintrag, sum(case when Volumen > 0 then 1 else 0 end) from @t group by Eintrag having count(Volumen) <= (select MinimumAmount from Settings) or sum(Volumen) = 0 order by Eintrag

                  ... entspricht das eher deinen Anforderungen?

                  bye,
                  Helmut

                  [edit] habe erst gerade die neuen Postings gesehen - muss nochmal nachdenken ...

                  Comment


                  • #10
                    Ja das klingt schon mal sehr gut. Muss ich mal probieren. Danke

                    Comment


                    • #11
                      Es hat fast geklappt. Hab es aber noch etwas abändern müssen. Mit dieser Methode scheint es zu klappen

                      Code:
                      select Eintrag from Table group by Eintrag having sum(case when Volume > 0 then 1 else 0 end) < (select MinimumAmount from Settings) or sum(Volume) = 0 order by Eintrag
                      Ich hoffe, da ist kein Fehler drin. Aber danke

                      Comment


                      • #12
                        Hm, so richtig habe ich dich noch nicht verstanden, aber ich glaube zu wissen was du meinst.

                        Wenn du mit WHERE auf Volume > 0 abfragst, dann bleibt kein Datensatz übrig (den man zählen könnte), wenn alle Flaschen leer sind. Somit tauchen komplett leere Bestände nicht in der Auflistung auf.

                        Also musst du zuerst dafür sorgen, dass immer ALLE Einträge gelistet werden.
                        z.B. so:
                        [highlight=sql]
                        select a.Eintrag, count(b.Eintrag) anzahl
                        from (
                        select distinct Eintrag
                        from tabelle
                        ) a
                        left join (
                        select Eintrag
                        from tabelle
                        where Volume > 0
                        ) b on b.Eintrag = a.Eintrag
                        group by a.Eintrag
                        having count(b.Eintrag) < 1
                        [/highlight]

                        Das ist nicht unbedingt schön, aber was Besseres fällt mir auf die Schnelle nicht ein.

                        Gruß Falk
                        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


                        • #13
                          Originally posted by Falk Prüfer View Post
                          ...Das ist nicht unbedingt schön, aber was Besseres fällt mir auf die Schnelle nicht ein.
                          Mit ein wenig Nachdenken...
                          [highlight=sql]
                          SELECT Eintrag, count(NULLIF(Volume = 0)) anz_nichtLeer
                          FROM tabelle
                          group by Eintrag
                          having count(NULLIF(Volume = 0)) < X
                          [/highlight]

                          Gruß Falk
                          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


                          • #14
                            Vielen Dank für eure Hilfe.

                            Comment

                            Working...
                            X