Announcement

Collapse
No announcement yet.

SELECT DISTINCT fasst zuviele Zeilen zusammen

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

  • SELECT DISTINCT fasst zuviele Zeilen zusammen

    Hallo,

    unter Access greife ich auf eine paradox DB zu und erreiche ich mit dieser Abfrage:

    SELECT DISTINCT zwbuchng.KST, stksstam.Name AS Kostenstelle, stkostar.Name, zwbuchng.Auftrag, Sum(zwbuchng.KorrDauer) AS Stunden
    FROM zwbuchng, prauftrg, stksstam, stkostar
    WHERE (((zwbuchng.Auftrag)=prauftrg.Auftrag))
    AND stksstam.Nummer=zwbuchng.KST
    AND stkostar.Nummer = zwbuchng.Kostenart
    GROUP BY zwbuchng.Auftrag, zwbuchng.KST, stksstam.Name, stkostar.Name
    ORDER BY zwbuchng.Auftrag, zwbuchng.KST;

    dieses Ergebnis (Auszug):
    KST | Kostenstelle | stkostar.Name | Auftrag | Stunden
    3300 | AV | AV | 2009016 | 34
    4400 | Masch | BAZ | 2009016| 24
    4400 | Masch | Kante | 2009016| 4
    4400 | Masch | allg | 2009016| 34
    4400 | Masch | Zuschnitt | 2009016| 12
    5500 | Hand | Holz | 2009016| 124
    5500 | Hand | Metall | 2009016| 54

    Das Problem liegt eigentlich im Tabellendesign (für das ich nicht verantwortlich bin), aber ich müsse die vier Zeilen mit der Kostenstelle "Masch" nochmals zu einer Zeile zusammenfassen und die Stunden aufsummieren. Dabei sollte die Trennung der KST "5500" aber beibehalten werden.
    Wenn ich stkostar.Name in der Abfrage weglassen würde, dann wären durch das DISTINCT die KST zusammengefasst. Im Prinzip wäre es gut, aber die KST "5500" muß getrennt bleiben.
    Wer sich von Euch bis hierher durchgequält hat: Irgend eine Anregung, in welche Richtung ich denken muß?

    Danke für's lesen.

    CodeGier

  • #2
    Hallo CodeGier,

    das DISTINCT kannst Du eigentlich weg lassen. Das Zusammenfassen läuft über die Gruppierung per GROUP BY. Das DISTINCT würde Dir nur doppelte Datensätze rausfiltern, wenn es die nach dem Gruppieren den noch gebe.

    In MS Access kannst Du mit dem IIF Befehl eine Fallunterscheidung auf "Ist 5500 oder nicht" machen und das auch in die Gruppierung einbeziehen, das sieht im Prinzip dann so aus:

    [highlight=SQL]
    SELECT ..... IIf(Kst='5500',1,0) AS IstKst5500,...
    FROM .....
    GROUP BY .... IIf(Kst='5500',1,0);
    [/highlight]
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Hallo Olaf,

      danke für Deine Antwort, das mit "IIf(Kst='4400',1,0)" ist eine gute Idee, aber es gibt noch Probleme.

      SELECT IIf(Kst='4400',1,0) AS IstKst4400, zwbuchng.KST, stksstam.Name AS Kostenstelle, stkostar.Name, zwbuchng.Auftrag, Sum(zwbuchng.KorrDauer) AS Stunden
      FROM zwbuchng, prauftrg, stksstam, stkostar
      WHERE (((zwbuchng.Auftrag)=prauftrg.Auftrag))
      AND stksstam.Nummer=zwbuchng.KST
      AND stkostar.Nummer = zwbuchng.Kostenart
      GROUP BY IIf(Kst='4400',1,0), zwbuchng.Auftrag, zwbuchng.KST, stksstam.Name, stkostar.Name
      ORDER BY zwbuchng.Auftrag, zwbuchng.KST;

      dieses Ergebnis kommt zu stande (Auszug):
      IstKst4400 | KST | Kostenstelle | stkostar.Name | Auftrag | Stunden
      0 | 3300 | AV | AV | 2009016 | 34
      1 | 4400 | Masch | BAZ | 2009016| 24
      1 | 4400 | Masch | Kante | 2009016| 4
      1 | 4400 | Masch | allg | 2009016| 34
      1 | 4400 | Masch | Zuschnitt | 2009016| 12
      0 | 5500 | Hand | Holz | 2009016| 124
      0 | 5500 | Hand | Metall | 2009016| 54

      die Gruppierung nach "IIf(Kst='4400',1,0)" wird ignoriert. Die Gruppierung nach "stkostar.Name" und "stksstam.Name" kommt der wohl in die Quere. Diese beiden Gruppierungen brauche ich zwar nicht, aber sobald die Felder im SELECT aufgeführt sind, braucht Access die auch im GROUP BY.

      Hast Du noch einen Tipp für mich auf Lager?

      CodeGier

      Comment


      • #4
        Ja, habe ich: Die beiden Felder im SELECT und GROUP BY weg lassen; wo Du Sie ja eh nicht braucht. Dir reicht doch die Info "Ist = 5500 oder nicht"
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          >> Die beiden Felder im SELECT und GROUP BY weg lassen
          Das wäre die pragmatische Lösung, die ich auch schon getestet habe, aber im SELECT brauche ich die Felder schon, nur in GROUP BY wären die überflüssig.
          Mir ist allerdings kein Weg bekannt die nur bei der Gruppierung weg zu lassen.

          Auf der Abfrage basiert dann ein Bericht, bei dem ich die Felder wieder brauche.

          >> Dir reicht doch die Info "Ist = 5500 oder nicht"
          Nein, diese Info alleine reicht leider nicht.

          CodeGier

          Comment


          • #6
            So wirklich verstehen tue ich es nicht, aber ich versuche es mal:

            Du kannst auch die Felder ins IIF (im Select / Group) ziehen:

            IIf(Kst='4400',stkostar.Name, '4400')

            Also wenn Kst = 4400 dann gruppier nach festen Wert => eine Zeile, sonst nach dem Namen => detailiert
            Olaf Helper

            <Blog> <Xing>
            * cogito ergo sum * errare humanum est * quote erat demonstrandum *
            Wenn ich denke, ist das ein Fehler und das beweise ich täglich

            Comment


            • #7
              Danke für Deine Hilfe. Die Logik des IIf im GROUP BY war mir so auch noch nicht klar, wieder was gelernt.

              Ich habe es jetzt mit einem verschachtelten IIF gelöst, schaut zwar nicht wirklich elegant aus, aber es tut. Hier das Monster:

              SELECT IIf(Kst='4400',1,IIf(stkostar.Nummer=800,3,IIf(stk ostar.Nummer=500,2,IIf(stksstam.Nummer='6600',4,0) ))) AS IstKst4400, zwbuchng.KST, zwbuchng.Auftrag, prauftrg.Name, stksstam.Nummer, stksstam.Name, IIf(stkostar.Nummer=800,'Metall',stksstam.Name) AS Kostenstelle, Sum(zwbuchng.KorrDauer) AS Stunden
              FROM zwbuchng, prauftrg, stksstam, stkostar
              WHERE (((zwbuchng.Auftrag)=prauftrg.Auftrag)) And stksstam.Nummer=zwbuchng.KST And stkostar.Nummer=zwbuchng.Kostenart And (Left(zwbuchng.Auftrag,4)="2009" Or Left(zwbuchng.Auftrag,4)="2008")
              GROUP BY IIf(Kst='4400',1,IIf(stkostar.Nummer=800,3,IIf(stk ostar.Nummer=500,2,IIf(stksstam.Nummer='6600',4,0) ))), zwbuchng.Auftrag, zwbuchng.KST, stksstam.Nummer, stksstam.Name, prauftrg.Name, IIf(stkostar.Nummer=800,'Metall',stksstam.Name)
              ORDER BY zwbuchng.Auftrag, zwbuchng.KST;

              Ciao

              CodeGier

              Comment


              • #8
                Schön, wenn es geht, auch wenn es etwas unübersichtlich ist.

                Wenn Du aber so viele Ausnahmen von der Regel hast, solltest Du Dir überlegen eine weitere Tabelle für eine Art "Gruppierungsebene" anzulegen.
                Kostenstellen sind zwar eher "sich langsam ändernde Stammdaten", aber sie ändern sich schon mal.
                Wenn was hinzukommt, musst Du das SQL Statement abändern; oder bei einer zusätzlichen Tabelle bloss einen weiteren Datensatz hinzufügen/ändern.
                Olaf Helper

                <Blog> <Xing>
                * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                Comment


                • #9
                  Ich weiß, das mit den Ausnahmen ist nicht sehr glücklich. Eigentlich sind die Stammdaten (Kostenstellen) unglücklich angelegt, da wäre eine grundsätzliche Änderung angebracht, dann wäre das SQL-Statement wesentlich einfacher zu erstellen.
                  Über Kurz oder Lang wird aber die komplette Software (Zeiterfassung) durch eine neue ersetzt, und dann kann ich die Kostenstellen so anlegen, wie wir sie heute brauchen. Die Auswertung, die ich jetzt als Access-Krücke gebaut habe, wird dann direkt in der neuen Software erstellt. Aber leider muß ich mich da noch ein Jahr gedulden ...
                  An der alten Software ändern wir aber nichts mehr "never change a running system", Du weißt ja.

                  Greetz

                  CodeGier

                  Comment

                  Working...
                  X