Announcement

Collapse
No announcement yet.

Reporting Services - Bericht mit Zwischensummen

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

  • Reporting Services - Bericht mit Zwischensummen

    Hallo allerseits,

    ich habe mich in letzter Zeit viel mit den Reporting Services befasst, brauche jetzt aber Hilfe bei einem Problem:

    Ich habe einen Matrix-Bericht erstellt, welcher den geleisteten Umsatz und Auftragseingang eines Vertreters pro Monat und Jahr darstellt.

    Das sieht bei mir dann folgendermaßen aus:



    Ich möchte jetzt aber zusätzlich noch die kumulierten Umsätze/Auftragseingänge (Gesamtsummen bis zu einem Monat) darstellen. Ich hatte mir das so gedacht, dass pro Jahr eine weitere Spalte "Kumuliert" eingeführt wird. In dieser müssten dann jeweils die Gesamtsummen des akutellen Monats und der Vormonate stehen.

    Beispielsweise: Vertreter1 hat im Januar 2000€, im Februar 4000€ und im März 3000€ umgesetzt dann müsste in der Kumuliert Spalte vom Januar für Vertreter 1 "2000€" stehen, im Februar "6000€" und im März "9000€".

    Kann mir jemand helfen wie ich das mit den Reporting Services (SQL Server 2005) realisieren kann? Ich wäre für jede Hilfe dankbar.

    Danke und Gruss

    Bernd Ostermann

    Nachtrag: Ich habe mal in Excel nachgestellt was mein Ziel ist:

    Zuletzt editiert von kabelgerd; 31.10.2008, 14:51.

  • #2
    Hallo Bernd,

    wenn ich es richtig verstanden habe, möchtes Du eine über den Monat laufende Summe je Vertreter haben; zu allem Überfluß in einer Pivot-Tabelle.

    Ich fürchte, rein mit dem Report-Design wird es etwas schwierig.
    Was in die Richtung geht und Dir nützlich sein wird, ist die Aggregation "RunningValue", siehe
    http://technet.microsoft.com/de-de/l...6(SQL.90).aspx

    Das große Problem ist, das Du eine bedingte Summierung benötigst, nämlich auf Basis des Vertreter; wie Du das hinbekommst, weiß ich noch nicht, vielleicht fällt mir noch was dazu ein.

    Da ich "faul" bin, würde ich das einfach bereits bei der Selektion der Daten mit seinem Sub-Select lösen, also bereits die laufenden Umsatzszahlen mit selektieren, dann braucht man sie wie die anderen Werte nur noch anzeigen, und muss nicht den Report rechnen lassen.
    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 schnelle Antwort. Leider bin ich in SQL noch nicht so involviert das ich ohne Schwierigkeiten ein Subselect durchführen könnte.

      Könntest du mir weiterhelfen wie so etwas auszusehen hätte?
      Die Abfrage, welche die Grundlage für den Report bildet sieht momentan so aus:

      SELECT
      dbo.ABF_Vorbereitung_Monate_Jahre_Vertreter.Jahr, dbo.ABF_Vorbereitung_Monate_Jahre_Vertreter.Monat,
      dbo.ABF_Vorbereitung_Monate_Jahre_Vertreter.Vertre ter1, dbo.ABF_Vorbereitung_Monate_Jahre_Vertreter.Vertre tername1, dbo.ABF_Vorbereitung_AuftragseingängeProVertreter. Auftragseingang, dbo.ABF_Vorbereitung_UmsätzeProVertreter.Umsatz
      FROM
      dbo.ABF_Vorbereitung_Monate_Jahre_Vertreter
      RIGHT OUTER JOIN
      dbo.ABF_Vorbereitung_UmsätzeProVertreter ON
      dbo.ABF_Vorbereitung_Monate_Jahre_Vertreter.Vertre ter1 = dbo.ABF_Vorbereitung_UmsätzeProVertreter.Vertreter 1 AND
      dbo.ABF_Vorbereitung_Monate_Jahre_Vertreter.Jahr = dbo.ABF_Vorbereitung_UmsätzeProVertreter.Jahr AND
      dbo.ABF_Vorbereitung_Monate_Jahre_Vertreter.Monat = dbo.ABF_Vorbereitung_UmsätzeProVertreter.Monat
      LEFT OUTER JOIN
      dbo.ABF_Vorbereitung_AuftragseingängeProVertreter ON
      dbo.ABF_Vorbereitung_Monate_Jahre_Vertreter.Monat = dbo.ABF_Vorbereitung_AuftragseingängeProVertreter. Monat AND
      dbo.ABF_Vorbereitung_Monate_Jahre_Vertreter.Jahr = dbo.ABF_Vorbereitung_AuftragseingängeProVertreter. Jahr AND
      dbo.ABF_Vorbereitung_Monate_Jahre_Vertreter.Vertre ter1 = dbo.ABF_Vorbereitung_AuftragseingängeProVertreter. Vertreter1

      Danke und Gruss

      Bernd Ostermann

      Comment


      • #4
        Aj, caramba, wer hat sich den die Tabellennamen ausgedacht

        Na, ja, Namen sind nur Schall&Rauch.
        Tipp: Nutze Aliase, das macht die Sache übersichtlicher.

        Das hier könnte schon das Ergebnis bringen; ich kann es natürlich nicht testen:

        [highlight=SQL]SELECT JahrVer.Jahr, JahrVer.Monat, JahrVer.Vertreter1, JahrVer.Vertretername1,
        AufVer.Auftragseingang, AufVer.Umsatz,
        (SELECT SUM(Sub.Umsatz)
        FROM dbo.ABF_Vorbereitung_AuftragseingängeProVertreter AS Sub
        WHERE JahrVer.Vertreter1 = Sub.Vertreter1
        AND JahrVer.Jahr = Sub.Jahr
        AND JahrVer.Monat <= Sub.Monat) AS LaufenderUmsatz
        FROM ABF_Vorbereitung_Monate_Jahre_Vertreter AS JahrVer
        RIGHT OUTER JOIN
        dbo.ABF_Vorbereitung_UmsätzeProVertreter AS UmsVer
        ON JahrVer.Vertreter1 = UmsVer.Vertreter 1 AND
        JahrVerJahr = UmsVer.Jahr AND
        JahrVer.Monat = UmsVer.Monat
        LEFT OUTER JOIN
        dbo.ABF_Vorbereitung_AuftragseingängeProVertreter AS AufVer
        ON JahrVer.Monat = AufVer.Monat AND
        JahrVer.Jahr = AufVer.Jahr AND
        JahrVer.Vertreter1 = AufVer.Vertreter1[/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


        • #5
          Hallo Olaf,

          leider konnte ich deine Antwort erst jetzt testen. Danke dafür. Bei der Abfrage kommt leider eine Fehlermeldung welche ich nicht deuten kann.
          Hast du eine Idee woran das liegen kann=?

          "Falsche Syntax in der Nähe von '1'"

          Die Feldnamen habe ich mehrmals auf Richtigkeit überprüft!
          Zuletzt editiert von kabelgerd; 06.11.2008, 11:00.

          Comment


          • #6
            Hallo Bernd,

            da waren schon im ersten Posting ein paar Leerzeichen reingerutscht, die nun die Fehler verursachen.

            Einfach folgendes Ändern:
            UmsVer.Vertreter 1 => UmsVer.Vertreter1
            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
              Hallo Olaf.

              Nochmals Danke für deine Antwort.
              Jetzt bemängelt er, dass er das Feld "Umsatz" nicht kennt. (Ungültiger Spaltenname 'Umsatz')

              So sieht die Abfrage jetzt aus. Ich habe übrigens die Tabellennamen geändert. Die heissen jetzt "Umsätze","MonVer" und "ABEingänge"

              SELECT
              JahrVer.Jahr, JahrVer.Monat, JahrVer.Vertreter1, JahrVer.Vertretername1, AufVer.Auftragseingang, UmsVer.Umsatz,
              (SELECT SUM(Sub.Umsatz) AS Expr1
              FROM dbo.ABEingänge AS Sub
              WHERE (JahrVer.Vertreter1 = Vertreter1) AND (JahrVer.Jahr = Jahr) AND (JahrVer.Monat <= Monat)) AS LaufenderUmsatz
              FROM dbo.MonVer AS JahrVer RIGHT OUTER JOIN
              dbo.Umsätze AS UmsVer ON JahrVer.Vertreter1 = UmsVer.Vertreter1 AND JahrVer.Jahr = UmsVer.Jahr AND
              JahrVer.Monat = UmsVer.Monat LEFT OUTER JOIN
              dbo.ABEingänge AS AufVer ON JahrVer.Monat = AufVer.Monat AND JahrVer.Jahr = AufVer.Jahr AND JahrVer.Vertreter1 = AufVer.Vertreter1

              Ich mag ja gar nicht mehr nerven....

              Comment


              • #8
                Das einzige Feld mit der Bezeichnung Umsatz kommt von
                UmsVer.Umsatz
                SUM(Sub.Umsatz)

                Das ist das Feld "dbo.ABF_Vorbereitung_UmsätzeProVertreter.Umsatz" aus Deinem ersten Posting.
                Wie die Felder bei Dir nun genau heissen, kann ich Dir natürlich auch nicht sagen.
                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
                  Hallo Olaf.

                  Ich habe das unbenennen der Tabellen erst mal wieder rückgängig gemacht. Ich habe auch den Fehler wegen des "Umsatz" Feldes gefunden:

                  SELECT JahrVer.Jahr, JahrVer.Monat, JahrVer.Vertreter1, JahrVer.Vertretername1, AufVer.Auftragseingang, UmsVer.Umsatz,
                  (SELECT SUM(Umsatz) AS Expr1
                  FROM dbo.ABF_Vorbereitung_UmsätzeProVertreter // Es muss die Umsatztabelle sein. Und nicht die mit den AB-Eingängen. Dort gibt es nämlich logischerweise kein "Umsatz" Feld.

                  AS Sub
                  WHERE (JahrVer.Vertreter1 = Vertreter1) AND (JahrVer.Jahr = Jahr) AND (JahrVer.Monat <= Monat)) AS LaufenderUmsatz
                  FROM dbo.ABF_Vorbereitung_Monate_Jahre_Vertreter AS JahrVer RIGHT OUTER JOIN
                  dbo.ABF_Vorbereitung_UmsätzeProVertreter AS UmsVer ON JahrVer.Vertreter1 = UmsVer.Vertreter1 AND JahrVer.Jahr = UmsVer.Jahr AND
                  JahrVer.Monat = UmsVer.Monat LEFT OUTER JOIN
                  dbo.ABF_Vorbereitung_AuftragseingängeProVertreter AS AufVer ON JahrVer.Monat = AufVer.Monat AND JahrVer.Jahr = AufVer.Jahr AND
                  JahrVer.Vertreter1 = AufVer.Vertreter1


                  Wenn ich jetzt auf Ausführen klicke, tut die Abfrage erst mal so als würde sie funktionieren. Nach einiger Zeit kommt dann aber folgendes Phänomen:

                  "Timeout ist abgelaufen. Das Zeitlimit wurde vor dem Beenden des Vorgangs überschritten oder der Server reagiert nicht"

                  Olaf, ich werd hier noch verrückt...

                  Comment


                  • #10
                    Es Subselect ist nicht sehr performant.
                    Wenn es "ordentliche" Indizes gibt, sollte es kein Problem darstellen.

                    Schränke es mal auf ein Jahr ein, ob es dann läuft:

                    WHERE AufVer.Jahr = 2008
                    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

                    Working...
                    X