Announcement

Collapse
No announcement yet.

Aufgabenstellung mit Distinct oder GROUP BY

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

  • Aufgabenstellung mit Distinct oder GROUP BY

    Hallo Zusammen,

    ich habe folgende Aufgabenstellung heute bekommen, wo ich bisher keine Idee habe, wie ich diese Realisieren kann.

    Folgende Aufgabenstellung:

    Ich muss alle Ergebnisse aus der "Ref1", welche die gleiche Nummer/Bezeichnung haben, gruppieren, unabhängig wieviele Belege dazu vorhanden sind. Neben der "Ref1" gibt es auch die "BelegNum", an Informationen. Die "BelegNum" soll aber keine Rolle spielen. Ich denke aber, dass ich diese wiederum brauchen werde, um die unterschiedlichen "DocArt" Informationen herauszufinden.

    Also habe ich folgendes gemacht:

    Code:
    select distinct T0.Ref1
    from Tabelle T0
    where KdNr = '1000'
    Das ist jedoch nur die "halbe" Wahrheit, denn ich muss in einer weiteren Spalte ausgeben, welche Belegarten dort gruppiert worden sind, welche in der Spalte "DocArt" stehen. Damit noch nicht genug, es sollen auch noch die Summen der Rechnung dort stehen, welche in "DocNetto" und DocBrutto: stehen.

    Sprich das Ergebnis sollte so aussehen:

    Ref1 | DocArt | DocNetto | DocBrutto
    1234 | Angebot, Auftrag, Lieferschein, Rechnung | 100,00 | 119,00


    Also habe ich folgendes versucht:
    Code:
    SELECT T0.Ref1, SUM("DocNetto"), SUM("DocBrutto")
    FROM Tabelle T0
    GROUP BY T0.Ref1
    Damit habe ich zwar immer noch nicht die Spalte "DocArt" berücksichtigt, dafür aber immerhin schon ein paar Werte erhalten. Das Ergebnis ist solange richtig, solange keine Summen bei den Angebote, Aufträgen etc. hinterlegt sind., welche die gleiche Ref1 ID haben. Sobald dies der Fall ist, stimmen meine Summen nicht immer, denn diese werden addiert, was nicht gewollt ist. Es sollen nur die Summen ausgegeben, die in der Verbindung "DocArt" = "Rechnung" verstehen.

    Hoffe ich konnte es verständlich erklären und jemand von euch hat eine Idee, wie ich weiterkomme.


    Vielen Dank schon mal im voraus!

    Gruß

    René
    Zuletzt editiert von catao; 04.03.2009, 09:17. Reason: Problem gelöst!

  • #2
    Originally posted by catao View Post
    Hallo Zusammen,

    ich habe folgende Aufgabenstellung heute bekommen, wo ich bisher keine Idee habe, wie ich diese Realisieren kann.

    Folgende Aufgabenstellung:

    Ich muss alle Ergebnisse aus der "Ref1", welche die gleiche Nummer/Bezeichnung haben, gruppieren, unabhängig wieviele Belege dazu vorhanden sind. Neben der "Ref1" gibt es auch die "BelegNum", an Informationen. Die "BelegNum" soll aber keine Rolle spielen. Ich denke aber, dass ich diese wiederum brauchen werde, um die unterschiedlichen "DocArt" Informationen herauszufinden.

    Also habe ich folgendes gemacht:

    Code:
    select distinct T0.Ref1
    from Tabelle T0
    where KdNr = '1000'
    Das ist jedoch nur die "halbe" Wahrheit, denn ich muss in einer weiteren Spalte ausgeben, welche Belegarten dort gruppiert worden sind, welche in der Spalte "DocArt" stehen. Damit noch nicht genug, es sollen auch noch die Summen der Rechnung dort stehen, welche in "DocNetto" und DocBrutto: stehen.

    Sprich das Ergebnis sollte so aussehen:

    Ref1 | DocArt | DocNetto | DocBrutto
    1234 | Angebot, Auftrag, Lieferschein, Rechnung | 100,00 | 119,00


    Also habe ich folgendes versucht:
    Code:
    SELECT T0.Ref1, SUM("DocNetto"), SUM("DocBrutto")
    FROM Tabelle T0
    GROUP BY T0.Ref1
    Damit habe ich zwar immer noch nicht die Spalte "DocArt" berücksichtigt, dafür aber immerhin schon ein paar Werte erhalten. Das Ergebnis ist solange richtig, solange keine Summen bei den Angebote, Aufträgen etc. hinterlegt sind., welche die gleiche Ref1 ID haben. Sobald dies der Fall ist, stimmen meine Summen nicht immer, denn diese werden addiert, was nicht gewollt ist. Es sollen nur die Summen ausgegeben, die in der Verbindung "DocArt" = "Rechnung" verstehen.

    Hoffe ich konnte es verständlich erklären und jemand von euch hat eine Idee, wie ich weiterkomme.


    Vielen Dank schon mal im voraus!

    Gruß

    René
    evtl so:
    [HIGHLIGHT="SQL"]SELECT T0.Ref1,
    SUM(CASE WHEN DocArt = 'RECHNUNG' THEN DocNetto ELSE 0 END),
    SUM(CASE WHEN DocArt = 'RECHNUNG' THEN DocBrutto ELSE 0 END)
    FROM Tabelle T0
    GROUP BY T0.Ref1[/HIGHLIGHT]

    Comment


    • #3
      Hallo ebis,

      ja genau so. Nur mit dem "kleinen" Problem dass mit der Ref1 ja mehrere Treffer hat und aus dem Grund mir teilweile die Summen nicht zurückgibt, denn er nimmt den ersten Treffer z.b. von den Lieferscheinen, zu denen es keine Preisinformationen gibt. Die Ursache versuche ich grad noch zu finden.


      In ähnlicher Form hatte ich es vorhin auch schon umgesetzt. Woran ich mir die Zähne ausbeiße ist, wie ich das mit DocArt realisieren kann. Denn ich habe in diesem Feld ja mehrere treffer, zu einer Ref1. Deswegen komme ich mit Distinct, Count etc. nicht weiter.

      Hast du eine Idee, wie ich all die Ergebnisse aus DocArt in einer Spalte bekomme, die den gleichen Nenner aus Ref1 haben? Im Netz und auch hier habe ich im weitesten Sinne etwas gefunden, diese Lösungen gehen aber oftmals in die Richtung neue Tabellen anzulegen, was in diesem Fall nicht geht.

      VG
      Rene
      Zuletzt editiert von catao; 03.03.2009, 00:11.

      Comment


      • #4
        Originally posted by catao View Post
        Sprich das Ergebnis sollte so aussehen:

        Ref1 | DocArt | DocNetto | DocBrutto
        1234 | Angebot, Auftrag, Lieferschein, Rechnung | 100,00 | 119,00
        Je nach Server

        MSSQL
        Oracle

        Viel Spaß

        Comment


        • #5
          Hi ebis!

          Super, so bekomme ich die Werte ich eine Spalte:

          Code:
          SELECT DISTINCT T0.Ref1 as Vorgangsnummer, LEFT(Objektliste, LEN(Objektliste)-1) AS Belegart
          FROM Tabelle T0
          CROSS APPLY
          		 (SELECT T1.DocArt + ', '
          		  FROM Tabelle T1
          		  WHERE T1.Ref1 = T0.Ref1  
          		  ORDER BY T1.DocArt 
          		  FOR XML PATH('')
          		 ) AS x(Objektliste)

          Wo sie mich dann verlassen ist, wie ich folgendes dort noch mit einbinden kann.

          Code:
          SELECT T0.Ref1,
          SUM(CASE WHEN DocArt = 'RECHNUNG' THEN DocNetto ELSE 0 END),
          SUM(CASE WHEN DocArt = 'RECHNUNG' THEN DocBrutto ELSE 0 END)
          FROM Tabelle T0
          GROUP BY T0.Ref1

          Wie kann ich die beiden Spalten (SUM) dort noch mit reinbringen??



          VG
          René

          Comment


          • #6
            vielleicht so...
            [HIGHLIGHT="SQL"]SELECT T0.Ref1 as Vorgangsnummer,
            LEFT(X.Objektliste, LEN(X.Objektliste)-1) AS Belegart,
            SUM(CASE WHEN DocArt = 'RECHNUNG' THEN DocNetto ELSE 0 END),
            SUM(CASE WHEN DocArt = 'RECHNUNG' THEN DocBrutto ELSE 0 END)
            FROM Tabelle T0
            CROSS APPLY
            (SELECT T1.DocArt + ','
            FROM Tabelle T1
            WHERE T1.Ref1 = T0.Ref1
            ORDER BY T1.DocArt
            FOR XML PATH('')
            ) AS x(Objektliste)
            FROM Tabelle T0
            GROUP BY T0.Ref1, X.Objektliste
            [/HIGHLIGHT]

            Comment


            • #7
              Hallo ebis,

              vielen Dank, jedoch bemängelt er folgendes:



              Code:
                 SELECT T0.Ref1 AS Vorgangsnummer,
                 LEFT(X.Objektliste, LEN(X.Objektliste)-1) AS Belegart,
                 SUM(CASE WHEN DocArt = 'RECHNUNG' THEN DocNetto ELSE 0 END),
                 SUM(CASE WHEN DocArt = 'RECHNUNG' THEN DocBrutto ELSE 0 END)
                 FROM Tabelle T0
                 CROSS APPLY
                 (SELECT T1.DocArt + ','
                 FROM Tabelle T1
                 WHERE T1.Ref1 = T0.Ref1 
                 ORDER BY T1.DocArt
                 FOR XML PATH('')
                 ) AS x(Objektliste)
                 FROM Tabelle T0 -- An dieser Stelle erhalte ich die Fehlermeldung
                 GROUP BY T0.Ref1, X.Objektliste
              Meldung 156, Ebene 15, Status 1, Zeile 14
              Falsche Syntax in der Nähe des 'FROM'-Schlüsselwortes.

              Was mich an der Query wundert ist, warum 2 mal T0 als From angegeben ist. Also habe ich was meckert rausgeworfen, also die FROM vor Group BY. Siehe da, es funktioniert soweit. Das Problem an der Sache ist nun, dass die Netto und Brutto-Summe nur mit 0,00 jeweils ausgegeben wird.

              Hast du dazu noch eine Idee?

              THX


              René

              Comment


              • #8
                Ich habs!

                Code:
                   SELECT T0.Ref1 AS Vorgangsnummer,
                   LEFT(X.Objektliste, LEN(X.Objektliste)-1) AS Belegart,
                   SUM(CASE WHEN DocArt like '%Re%'  THEN DocNetto ELSE 0 END),
                   SUM(CASE WHEN DocArt like '%Re%'  THEN DocBrutto ELSE 0 END)
                   FROM Tabelle T0
                   CROSS APPLY
                   (SELECT T1.DocArt + ','
                   FROM Tabelle T1
                   WHERE T1.Ref1 = T0.Ref1 
                   ORDER BY T1.DocArt
                   FOR XML PATH('')
                   ) AS x(Objektliste)
                   GROUP BY T0.Ref1, X.Objektliste
                Habe vielen Dank für deine Unterstützung, ohne die ich nicht zu dem gewünschten Ziel gekommen wäre.

                Comment


                • #9
                  Hallo Ebis,

                  ein kleines Problem habe ich noch und zwar, wenn das Feld T0.Ref1 ein "NULL" zurückgibt, habe ich es auch in der Auswertung drin. Das darf aber nicht passieren. Nur wenn wirklich ein Wert XYZ in dem Feld "T0.Ref1" drin steht, soll alles weitere angezeigt werden.

                  Wenn ich es so versuche:

                  Code:
                    
                     SELECT IsNull(T0.Ref1 ,'') as Vorgangsnummer
                     LEFT(X.Objektliste, LEN(X.Objektliste)-1) AS Belegart,
                     SUM(CASE WHEN DocArt like '%Re%'  THEN DocNetto ELSE 0 END),
                     SUM(CASE WHEN DocArt like '%Re%'  THEN DocBrutto ELSE 0 END)
                     FROM Tabelle T0
                     CROSS APPLY
                     (SELECT T1.DocArt + ','
                     FROM Tabelle T1
                     WHERE T1.Ref1 = T0.Ref1 
                     ORDER BY T1.DocArt
                     FOR XML PATH('')
                     ) AS x(Objektliste)
                     GROUP BY T0.Ref1, X.Objektliste
                  Dann steht logischer Weise auch nichts dort drin. In dem Feld "DocArt" steht dann weiterhin "NULL". Also habe ich .. (SELECT IsNull(T1.DocArt ,'') + ',' .. auch berücksichtigt. Nur habe ich in dem Feld weiterhin NULL drin stehen.

                  Wo habe ich dort noch einen Gedankenfehler?

                  VG
                  René


                  Ich habe mittlerweile herausgefunden, wieso ich die 1. Zeile zurückbekomme. Und zwar zählt er alle Rechnungsbeträge zusammen, zu denen er keine Vorgangsnummer findet.

                  Nun stellt sich die Frage, wie ich das verhindern kann.
                  Zuletzt editiert von catao; 04.03.2009, 12:02.

                  Comment


                  • #10
                    Nun hab ich es!

                    Habe die Where-Bedingung noch um folgendes erweitert:
                    T0.Ref1 is not NULL



                    So nun aber ....

                    Comment

                    Working...
                    X