Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Aggregatsfunktion?!?

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von N811en, 1 Oktober 2014.

  1. N811en

    N811en Neuer Benutzer

    Hallo!

    Ich als SQL-Neuling hätte eine Frage und zwar bin ich gerade beim Erstellen eines Jahresstundenblatts für die geleisteten Stunden von Mitarbeitern.

    Ich habe daher eine Funktion JS_berechneSaldo geschrieben, welche als Übergabeparameter folgende Werte bekommt:
    1. Jahresstunden_ID (Schüssel zur Identifikation für welches Jahresstundenblatt)
    2. Monat_ID (ID für welchen Monat es sich handelt - 1 = Jänner, 2 = Februar,...)
    3. Jahr_ID (gewünschtes Jahr)
    4. IST (decimal-Wert mit Ist-Stunden)
    5. SOLL (decimal-Wert mit Soll-Stunden)
    6. SOLL-Korrektur (decimal-Wert für evtl. Soll-Stunden-Korrektur)
    Der Rückgabewert ist dabei ein decimal-Wert, welcher die Differenz der IST & Soll-Stunden darstellt und für jeden Monat aufsummiert wird.

    So funktioniert das Ganze wie gewünscht, allerdings nur mit händisch-eingegebenen Zahlen:

    SELECT dbo.JS_berechneSaldo(6, 1, 2014, 121.5, 12.6, 0)AS Jaenner

    SELECT dbo.JS_berechneSaldo(6, 1, 2014, 121.5, 12.6, 0)+ dbo.JS_berechneSaldo(6, 2, 2014, 94.5, 16, 0)AS Februar

    SELECT dbo.JS_berechneSaldo(6, 1, 2014, 121.5, 12.6, 0)+ dbo.JS_berechneSaldo(6, 2, 2014, 94.5, 16, 0)+ dbo.JS_berechneSaldo(6, 3, 2014, 440.5, 84, 0)AS Maerz

    Nun meine Frage, wie kann SQL die Monate automatisch aufsummieren? Ich habe gehört mit einer Aggregatsfunktion könnte dies funktionieren, allerdings habe ich keine Ahnung wie ich diese erstellen muss, da SQL-Server beim erstellen sagt ich brauche eine Assembly?!?

    Ich bitte um Hilfe.
    Danke und einen schönen Tag noch!
     
  2. ukulele

    ukulele Datenbank-Guru

    Also Aggregat-Funktionen nutzt man normalerweise in Verbindung mit GROUP BY. Das wiederum wendet man normalerweise auf Tabellen oder Sichten an. Warum schmeist du hier deine Zahlen einzeln und händisch in eine Funktion die nichts anderes als Addieren und Subtrahieren macht? Kommen deine Daten nicht aus einer Tabelle?
     
  3. N811en

    N811en Neuer Benutzer

    Doch klar kommen die Daten aus einer Table, die drei SELECTS waren nur für euch zur besseren Veranschaulichung was ich genau erreichen will, denn der Aufruf der Funktion berechneSaldo() ist 5 Zeilen lang. Aber meine Frage ist eigentlich, wie kann ich in SQL das Saldo pro Monat aufsummieren?
    Hier noch genauer erklärt: Für den Jänner muss ich IST (O18) - SOLL(P18) + Zeitausgleich Vortrag(Q16) rechnen, dies funktioniert auch.
    Nun muss ich für den Februar IST(O19) - SOLL(P19) + Saldo_Jänner(Q18) rechnen. Ich bin soweit, dass ich eine neue Funktion berechneSaldoVormonat() habe, welche mir das Saldo des Vormonats liefert. Allerdings muss ich jetzt Saldo_Jänner(Q18) + Saldo_Februar(Q19) rechnen und hier komm ich nicht weiter.
    upload_2014-10-2_16-14-6.png
     
  4. ukulele

    ukulele Datenbank-Guru

    Da gibts verschiedene Möglichkeiten, ich kenne jetzt deine Tabellenstruktur nicht. Hier mal ein Beispiel mit Testtabelle:
    Code:
    WITH tabelle AS (
    SELECT    2014 AS Jahr,
            1 AS Monat,
            1 AS Wert
    UNION ALL
    SELECT    2014 AS Jahr,
            2 AS Monat,
            2 AS Wert
    UNION ALL
    SELECT    2014 AS Jahr,
            2 AS Monat,
            3 AS Wert
    UNION ALL
    SELECT    2015 AS Jahr,
            1 AS Monat,
            4 AS Wert
    )
    SELECT    t.Jahr,
            t.Monat,
            sum(t.Wert) AS Wert,
            (    SELECT    sum(Wert)
                FROM    tabelle
                WHERE    Jahr = t.Jahr
                AND        Monat <= t.Monat ) AS Wert_kommuliert
    FROM    tabelle t
    GROUP BY t.Jahr,t.Monat
    ORDER BY t.Jahr,t.Monat
    Eventuell macht es mehr Sinn mit einem Join statt einem Subselect zu arbeiten, das müsste man sich noch überlegen.
     
  5. N811en

    N811en Neuer Benutzer

    Hey das schaut eh schon ganz gut aus, werde ich gleich mal probieren ob ich das auf meine Tables umwandeln kann.
    Danke =)
     
  6. akretschmer

    akretschmer Datenbank-Guru

    M$SQL kann doch Window-Funktionen, oder? Da kannst doch einfach ein Fenster via sum(...) over (partition by ...) machen.
     
  7. ukulele

    ukulele Datenbank-Guru

    Stimmt das könnte auch gehen.
     
Die Seite wird geladen...
Ähnliche Themen - Aggregatsfunktion
  1. ansim
    Antworten:
    8
    Aufrufe:
    2.848

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden