none
SQL Abfrage Summen/Gruppen RRS feed

  • Frage

  • Hallo!
    Ich habe eine Tabelle, wo Kundennummer, Hauptgruppen und Umsätze erfasst sind und brauche pro Kunde eine Datenzeile, mit den summierten Gruppen - also nur 1 Satz.
    Könnte mir jemand bei der SQL Abfrage behilflich sein?
    Vielen Dank Ms

    z.B.
    Kdnr  Gruppe Umsatz
    K123 Grup01 70,10
    K123 Grup02 50,00
    K123 Grup01 30,00
    K333 Grup01 40,20
    K333 Grup02 15,10
    usw.

    gewünschtes Ergebnis:
    Kdnr   Sum(Grup01)   Sum(Grup02) ...
    K123   100,10             50,00
    K333     40,20             15,10

     

    Donnerstag, 19. April 2012 14:48

Antworten

  • Hi,

    wie Daniel schon sagte, dies kannst du mit dem PIVOT Operator erledigen, ich habe dir dein Beispiel mal geschrieben.

    Use TempDB
    
    Create Table #Test
    (Kdnr   varchar(4),
     Gruppe varchar(6),
     Umsatz decimal(4,2))
    
     Insert into #Test (kdnr,Gruppe,Umsatz) Values ('K123', 'Grup01', 70.10)
     Insert into #Test (kdnr,Gruppe,Umsatz) Values ('K123', 'Grup02', 50.00)
     Insert into #Test (kdnr,Gruppe,Umsatz) Values ('K123', 'Grup01', 30.00)
     Insert into #Test (kdnr,Gruppe,Umsatz) Values ('K133', 'Grup01', 70.10)
     Insert into #Test (kdnr,Gruppe,Umsatz) Values ('K123', 'Grup01', 40.20)
     Insert into #Test (kdnr,Gruppe,Umsatz) Values ('K133', 'Grup02', 15.10)
    
     --Statisches Pivot
     --Hier werden die Pivot Spalten statisch vergeben
    
     Select Kdnr, [Grup01] , [Grup02]
     from (
    		Select Kdnr, Gruppe, Umsatz from #Test
    	  ) pv
     Pivot
     (
     Sum(Umsatz)
     FOR Gruppe in
     ([Grup01],[Grup02])
     ) as pvt
    
    
    -- Dynamische erzeugung eines Pivots
    --Hier werden die Spalten für das Pivot dynamisch generiert
    
    DECLARE @Gruppe NVARCHAR(2000)
    SELECT @Gruppe = COALESCE(@Gruppe + ',[' + Gruppe + ']',
                             '[' + Gruppe + ']')
    FROM    (Select distinct Gruppe from #Test) Gruppe
    ORDER BY Gruppe
    
    
     DECLARE @SQL NVARCHAR(4000)
    SET @SQL = N'	Select Kdnr, ' + @Gruppe + ' 
    				 from (
    						Select Kdnr, Gruppe, Umsatz from #Test
    					 ) pv
    				Pivot
    					(
    						Sum(Umsatz)
    				FOR Gruppe in('+@Gruppe+')) as pvt
    				'
    EXECUTE(@SQL)
    
    Drop Table #Test

    Ich hoffe es hilft Dir weiter

    Gruß

    Theo


    • Bearbeitet Breimeyer Donnerstag, 19. April 2012 17:42 SQL Sript erweitert
    • Als Antwort markiert Michael-s-19 Freitag, 20. April 2012 06:42
    Donnerstag, 19. April 2012 17:19

Alle Antworten

  • ich gehe mal davon aus, dass die Gruppen bekannt sind und eine feste Anzahl umfasst.

    In diesem Falle kannst Du der PIVOT Operator benutzen um Gruppe & Umsatz in eigene Spalten pro Gruppe zu mappen und danach den GROUP BY Operator anwenden:

    siehe die Beschreibung fuer PIVOT Using PIVOT and UNPIVOT schau Dir die Beispiel an, sie sollten relativ leicht fuer Deinen Fall anpassbar sein (Im Beispiel COMPLEX Pivot sample muesste dann einfach COUNT durch SUM ersetzt werden)

    Sonst poste einfach den Tabellen- und die Spaltennamen, dann wird sicher auch noch ein fertiges Codefragment gepostet werden.

    Donnerstag, 19. April 2012 16:01
  • Hi,

    wie Daniel schon sagte, dies kannst du mit dem PIVOT Operator erledigen, ich habe dir dein Beispiel mal geschrieben.

    Use TempDB
    
    Create Table #Test
    (Kdnr   varchar(4),
     Gruppe varchar(6),
     Umsatz decimal(4,2))
    
     Insert into #Test (kdnr,Gruppe,Umsatz) Values ('K123', 'Grup01', 70.10)
     Insert into #Test (kdnr,Gruppe,Umsatz) Values ('K123', 'Grup02', 50.00)
     Insert into #Test (kdnr,Gruppe,Umsatz) Values ('K123', 'Grup01', 30.00)
     Insert into #Test (kdnr,Gruppe,Umsatz) Values ('K133', 'Grup01', 70.10)
     Insert into #Test (kdnr,Gruppe,Umsatz) Values ('K123', 'Grup01', 40.20)
     Insert into #Test (kdnr,Gruppe,Umsatz) Values ('K133', 'Grup02', 15.10)
    
     --Statisches Pivot
     --Hier werden die Pivot Spalten statisch vergeben
    
     Select Kdnr, [Grup01] , [Grup02]
     from (
    		Select Kdnr, Gruppe, Umsatz from #Test
    	  ) pv
     Pivot
     (
     Sum(Umsatz)
     FOR Gruppe in
     ([Grup01],[Grup02])
     ) as pvt
    
    
    -- Dynamische erzeugung eines Pivots
    --Hier werden die Spalten für das Pivot dynamisch generiert
    
    DECLARE @Gruppe NVARCHAR(2000)
    SELECT @Gruppe = COALESCE(@Gruppe + ',[' + Gruppe + ']',
                             '[' + Gruppe + ']')
    FROM    (Select distinct Gruppe from #Test) Gruppe
    ORDER BY Gruppe
    
    
     DECLARE @SQL NVARCHAR(4000)
    SET @SQL = N'	Select Kdnr, ' + @Gruppe + ' 
    				 from (
    						Select Kdnr, Gruppe, Umsatz from #Test
    					 ) pv
    				Pivot
    					(
    						Sum(Umsatz)
    				FOR Gruppe in('+@Gruppe+')) as pvt
    				'
    EXECUTE(@SQL)
    
    Drop Table #Test

    Ich hoffe es hilft Dir weiter

    Gruß

    Theo


    • Bearbeitet Breimeyer Donnerstag, 19. April 2012 17:42 SQL Sript erweitert
    • Als Antwort markiert Michael-s-19 Freitag, 20. April 2012 06:42
    Donnerstag, 19. April 2012 17:19
  • weltmeisterlich !!

    genau das, was ich brauche

    Vielen Dank für Eure Hilfe.

    Michael

    Freitag, 20. April 2012 06:43