none
Teil-Summenbildung über mehrere Felder RRS feed

  • Frage

  • Ich muss Summen bilden und zwar je Mitarbeiter im Monat (in diesem Beispiel immer derselbe)
    pro Projekt, Lohnart und Kostenstelle

    Es sollte also in Etwa sowas bei rauskommen

    MITARBEITER,     PROJEKT,     LOHNART, Kostenstelle, Gesamtstunden/je Monat
    Dietrich                10063,          030..,        124               16
    Dietrich,               9999,            035..,                              2
    Dietrich,               10824,          031..,        126                6
    Dietrich,               10824/01,     030..,        126                5

    Ich habe schon rumexperimentier mit GROUP BY, bin aber zu keinem Ergebnis gekommen dass mich dem Ziel näher bringt

    Hier mal Scripte für Tabelle und Daten


    -- Tabelle erstellen
    CREATE TABLE [dbo].[STZ_Nachweis](
        [id] [int] IDENTITY(1,1) NOT NULL,
        [Datum] [date] NOT NULL,
        [Projekt] [nchar](15) NULL,
        [Lohnart] [nchar](30) NOT NULL,
        [Kst] [nchar](30) NOT NULL,
        [Ueberst] [float] NULL,
        [NormalStd] [float] NULL,
        [Bemerkung] [nchar](50) NULL,
        [Mitarbeiter] [nchar](25) NULL,
        [Pos] [float] NULL
    ) ON [PRIMARY]
    
    
    -- Daten einfügen
    
    SET NOCOUNT ON;
    SET XACT_ABORT ON;
    GO
    SET IDENTITY_INSERT [dbo].[STZ_Nachweis] ON;
    BEGIN TRANSACTION;
    INSERT INTO [dbo].[STZ_Nachweis]([id], [Datum], [Projekt], [Lohnart], [Kst], [Ueberst], [NormalStd], [Bemerkung], [Mitarbeiter], [Pos])
    SELECT 1, '20130801 00:00:00.000', N'10063          ', N'030 Auftragsstd.              ', N'124                           ', NULL, 8, N'autoCad Zeichnung gefertigt                       ', N'Dietrich                 ', 1 UNION ALL
    SELECT 2, '20130802 00:00:00.000', N'10063          ', N'030 Auftragsstd.              ', N'124                           ', NULL, 8, N'Kundenbesuch                                      ', N'Dietrich                 ', 1 UNION ALL
    SELECT 3, '20130802 00:00:00.000', N'9999           ', N'035 Überstd.o.We              ', N'                              ', 2, NULL, N'Nachkalkulation                                   ', N'Dietrich                 ', 2 UNION ALL
    SELECT 4, '20130803 00:00:00.000', N'10824          ', N'031 Angebotsstd.              ', N'126                           ', NULL, 6, N'Vertragsverhandlungen                             ', N'Dietrich                 ', 1 UNION ALL
    SELECT 5, '20130809 00:00:00.000', N'10824/01       ', N'031 Angebotsstd.              ', N'126                           ', NULL, 5, NULL, N'Dietrich                 ', NULL
    COMMIT;
    RAISERROR (N'[dbo].[STZ_Nachweis]: Insert Batch: 1.....Done!', 10, 1) WITH NOWAIT;
    GO
    SET IDENTITY_INSERT [dbo].[STZ_Nachweis] OFF;
    
    Select * from STZ_Nachweis
    

    Ich wär echt für Hilfe dankbar...

    Gruß

    Heiko

    Samstag, 31. August 2013 06:38

Antworten

  • Hallo Heiko,

    wenn Du nicht was vergessen hast, was es komplizierter macht, wäre es:

    SELECT 
          Mitarbeiter, MONTH([Datum]) AS Monat, Projekt, Lohnart, Kst,
          SUM(ISNULL([NormalStd], 0) + ISNULL([Ueberst], 0)) AS Summe
       FROM STZ_Nachweis
       GROUP BY Mitarbeiter, MONTH([Datum]), Projekt, Lohnart, Kst;

    (bei jahresüberspannenden Daten käme noch ein YEAR hinzu).

    Gruß Elmar

    Samstag, 31. August 2013 09:47
    Beantworter

Alle Antworten

  • Hallo Heiko,

    wenn Du nicht was vergessen hast, was es komplizierter macht, wäre es:

    SELECT 
          Mitarbeiter, MONTH([Datum]) AS Monat, Projekt, Lohnart, Kst,
          SUM(ISNULL([NormalStd], 0) + ISNULL([Ueberst], 0)) AS Summe
       FROM STZ_Nachweis
       GROUP BY Mitarbeiter, MONTH([Datum]), Projekt, Lohnart, Kst;

    (bei jahresüberspannenden Daten käme noch ein YEAR hinzu).

    Gruß Elmar

    Samstag, 31. August 2013 09:47
    Beantworter
  • Hallo Heiko,

    Das Statement von Elmar sollte passen, allerdings solltest Du noch weiter auf YEAR(Datum) gruppieren (oder filter), sonst hast Du nächstes Jahr die Monatswerte von 2013 und 2014 zusammen.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Sonntag, 1. September 2013 07:40
  • Danke an Elmar, das war die Lösung.

    @Olaf: wie muss denn das Statement aussehen, wenn ich - was ja gefordert ist - nur über den Monat des aktuellen Jahres saldiert werden soll:

    SELECT 
          Mitarbeiter, YEAR([Datum]), MONTH([Datum]) AS Monat, Projekt, Lohnart, Kst,
          SUM(ISNULL([NormalStd], 0) + ISNULL([Ueberst], 0)) AS Summe
       FROM STZ_Nachweis
       GROUP BY Mitarbeiter, YEAR([Datum]),MONTH([Datum]), Projekt, Lohnart, Kst;
    Where YEAR([Datum]) = year(now( ))

    ???

    Ist aus dem Gedächtnis heraus und ungetestet da ich grad keine Management Konsole parat habe...

    Gruß und Danke für die Hilfe

    Heiko

    Sonntag, 1. September 2013 11:27
  • Hallo Heiko,

    die WHERE Klausel kommt nach dem FROM, nicht nach dem GROUP BY.

    Grundsätzlich geht es so, ich gebe nur zu bedenken, das dann kein Index verwendet werden kann, wenn Du eine Funktion auf eine Spalte im Filter verwendest.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Montag, 2. September 2013 07:21
  • Hallo,

    eine Abfrage auf den aktuellen Monat wäre:

    SELECT 
          Mitarbeiter,  YEAR([Datum]), MONTH([Datum]) AS Monat, Projekt, Lohnart, Kst,
          SUM(ISNULL([NormalStd], 0) + ISNULL([Ueberst], 0)) AS Summe
       FROM STZ_Nachweis
       WHERE -- Monatsanfang
    	[Datum] >= DATEADD(MONTH, DATEDIFF(MONTH,'19000101',GETDATE()), '19000101')	
    	-- Monatsende (SQL Server 2012 auch EOMONTH)
    	AND [Datum] <= DATEADD(DAY,-1,DATEADD(MONTH,0,DATEADD(MONTH,DATEDIFF(MONTH,'19000101',GETDATE())+1,'19000101')))
       GROUP BY Mitarbeiter, YEAR([Datum]), MONTH([Datum]), Projekt, Lohnart, Kst;

    Wobei man i. a. eine Funktion für gängige Berechnungen wie Monatsanfang, -ende verwenden sollte - wird übersichtlicher und verständlicher.

    Ggf. solltest Du ein Prozedur verwenden so dass Du den angezeigten Monat frei bestimmen kannst, da man solche Auswertungen oftmals für unterschiedliche Monate / Bereiche braucht.

    Gruß Elmar


    Montag, 2. September 2013 08:26
    Beantworter
  • Freitag, 6. September 2013 09:54
    Moderator
  • Hallo an alle

    Ja, wie schon gepostet hat mir Elmars Hinweis geholfen. Leider scheint die Funktion "Als Antwort markieren" nicht mit allen Browsern zu funktionieren, denn ich habe Elmars Post als Antwort markiert. Trotzdem Danke für den Hinweis wie für die Hilfe.

    Gruß

    Heiko

    Freitag, 6. September 2013 12:09