Announcement

Collapse
No announcement yet.

Gruppierung mit verschiedenen Kriterien

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

  • Gruppierung mit verschiedenen Kriterien

    Hallo zusammen,

    ich habe eine Tabelle, die in etwa wie folgt aussieht:

    Kunde | Art.Nr. | Datum | Stück | Transaktion
    ----------------------------------------------------------
    1 | 12 | 1.12. | 3 | Kauf
    1 | 12 | 1.12. | -4 | Verkauf
    1 | 12 | 1.12. | 10 | Ausschüttung
    1 | 12 | 1.12. | 8 | Ausschüttung
    1 | 12 | 1.12. | 5 | Einbuchung
    1 | 12 | 1.12. | -5 | Ausbuchung
    2 | 13 | 2.12. | 5 | Kauf
    usw.

    Mit Hilfe einer T-SQL-Abfrage möchte ich das folgende Ergebnis erzielen:

    Kunde | Art.Nr. | Datum | Stück | Transaktion
    ----------------------------------------------------------
    1 | 12 | 1.12. | -1 | Verkauf
    1 | 12 | 1.12. | 18 | Ausschüttung
    2 | 13 | 2.12. | 5 | Kauf

    Es soll also eine Gruppierung pro Kunde, Art.Nr. und Datum vorgenommen werden. Kauf- und Verkäufe sowie Ein- und Ausbuchungen sollen saldiert werden. Wie erreiche ich die Gruppierung über verschiedene Transaktionsgruppen?

    Danke schon mal für die Hilfe!

    Christoph

  • #2
    Geht mit GROUP BY und SUM, etwa so:

    select Kunde, Art.Nr., Datum, SUM(Stück), Transaktion
    from tabelle
    GROUP BY Kunde, Art.Nr., Datum, Transaktion

    bye,
    Helmut

    Comment


    • #3
      Danke, aber das Problem ist, dass über jeweils verschiedene Einträge (z.B. Kauf und Verkauf) der Spalte Transaktionen gruppiert werden soll.
      Dies funktioniert mit der Standard-Gruppierung leider nicht...

      Comment


      • #4
        Geht schon, und zwar unter Zuhilfenahme von CASE:

        select Kunde, Art.Nr., Datum, SUM(Stück),
        CASE when Transaktion in ('Kauf', 'Verkauf') then 'KaufVerkauf' when Transaktion in
        ('Einbuchung', 'Ausbuchung') then 'EinAusbuchung' when ... else 'allgemein' end as Transaktionsgruppe
        from tabelle
        GROUP BY Kunde, Art.Nr., Datum, CASE when Transaktion in ('Kauf', 'Verkauf') then 'KaufVerkauf' when Transaktion in
        ('Einbuchung', 'Ausbuchung') then 'EinAusbuchung' when ... else 'allgemein' end


        Man muss hier zwar die gesamte CASE-Konstruktion exakt zweimal gleich angeben, aber wenn's so zur der gewünschten Lösung führt ...

        bye,
        Helmut

        Comment


        • #5
          Danke, das klappt schon mal ganz gut.

          Allerdings will ich noch Transaktion in Abhängigkeit von SUM(Stück) setzen, d.h.

          case when SUM(Stück) > '0' Then 'Kauf'
          when SUM(Stück) < '0' then 'Verkauf'
          when SUM(Stück) = '0' then 'Roundtrip'
          end


          Da spuckt mir SQL allerdings die Fehlermeldung 144 aus, da das Aggregat in der Gruppierungszeile nicht erlaubt ist...

          Eine andere Möglichkeit wäre vermutlich, das ganze in einzelne Abfragen nach Kauf/Verkauf bzw. nach Ein/Ausbuchungen aufzuteilen und diese per UNION wieder zusammenzufügen. Aber das hätte vermutlich deutliche Performanceverluste zur Folge, oder?

          Grüße, Christoph

          Comment


          • #6
            Zeige mal das Statement, ich denke, du versuchst das auch sowohl im SELECT-Teil als im GROUP BY-Teil einzutragen, aber in diesem Fall gehört es nur in den SELECT-Teil. Du kannst einfach das CASE-Konstrukt aus meinem Beispiel entsprechend umbauen, denn im GROUP BY brauchst du es zwar so wegen der Gruppierung aber deswegen muss es nicht im SELECT-Teil stehen und was sich aus Aggregaten ergibt (also dem SUM) darf im SELECT stehen aber nicht im GROUP BY. Könnte also etwa so aussehen:

            select Kunde, Art.Nr., Datum, SUM(Stück),
            case when SUM(Stück) > '0' Then 'Kauf'
            when SUM(Stück) < '0' then 'Verkauf'
            else 'Roundtrip' end as Transaktion
            from tabelle
            GROUP BY Kunde, Art.Nr., Datum, CASE when Transaktion in ('Kauf', 'Verkauf') then 'KaufVerkauf' when Transaktion in
            ('Einbuchung', 'Ausbuchung') then 'EinAusbuchung' when ... else 'allgemein' end


            Hinweis: nie das else ... end im CASE vergessen, das ist immer erforderlich!

            bye,
            Helmut

            Comment


            • #7
              Das ganze sieht so aus:

              SELECT Kunde, Art.Nr., Datum, Sum(Stück) as Stueck,

              case when TRANSAKTION in ('Kauf', 'Verkauf') Then
              case when SUM(Stück) > '0' Then 'Kauf'
              when SUM(Stück) < '0' then 'Verkauf'
              else 'Roundtrip'
              end
              when TRANSAKTION in ('Einbuchung', 'Ausbuchung') Then
              case when SUM(Stück) > '0' Then 'Einbuchung'
              when SUM(Stück) < '0' then 'Ausbuchung'
              else 'ZeroBuchung'
              end
              else TRANSAKTION
              end as Transaktion
              FROM Tabelle
              GROUP by Kunde, Art.Nr., Datum,
              case when TRANSAKTION in ('Kauf', 'Verkauf') Then
              case when SUM(Stück) > '0' Then 'Kauf'
              when SUM(Stück) < '0' then 'Verkauf'
              else 'Roundtrip'
              end
              when TRANSAKTION in ('Einbuchung', 'Ausbuchung') Then
              case when SUM(Stück) > '0' Then 'Einbuchung'
              when SUM(Stück) < '0' then 'Ausbuchung'
              else 'ZeroBuchung'
              end
              else TRANSAKTION
              end




              Das Problem ist doch auch, dass ich mich im GROUP BY nicht auf den im SELECT neu erstellten Spaltentitel (as Transaktion) beziehen kann...

              Comment


              • #8
                Okay, jetzt habe ich dich verstanden - da hast du allerdings recht. Würde sagen, du machst das mit UNION, habe da im Moment auch keine bessere Idee. Und wegen der Performance ist viel wichtiger, dass Indizes und Statistiken passen, dann macht der Optimizer den Rest

                bye,
                helmut

                Comment


                • #9
                  alles klar, aber trotzdem danke für die Hilfe!

                  Comment

                  Working...
                  X