none
Linq - Summierung von mehreren Spalten RRS feed

  • Frage

  • Hi,

    ich würde gerne dieses SQL-Statement als Linq-Abfrage schreiben, weiss aber nicht wie:

    SELECT Datum, SUM(Wert1), SUM(Wert2), Sum(Wert3), Sum(Wert4) FROM Tabelle GROUP BY Datum

    Bisher sieht mein Query so aus, aber ich weiss nicht wie ich die Summierung hinbekomme:

    Dim

    listAuswertung = (From x In list  Group By key = New With {x.Datum, x.Wert1, x.Wert2, x.Wert3, x.Wert4} Into Group Select key).tolist

    Hat das von Euch schon jemand gemacht?

    Gruß
    Kim

     


    Dienstag, 12. April 2011 13:07

Antworten

  • Hallo Kim,

    vom Prinzip läuft es bei LINQ genauso wie bei SQL.

    In Deiner SQL Anweisung wäre die Datum-Spalte der Gruppierungsschlüssel und so müsste es auch in LINQ sein.
    In der Group stehen alle Instanzen (SQL Zeilen), auf die der Gruppierungsschlüssel zutrifft.
    Auf die darin gelieferten Werte führt man das Summieren aus, in dem man die zu summierenden Eigenschaft
    als Lambda-Ausdruck übergibt. Wobei es sich dabei nicht nur um eine einfache Eigenschaft wie in diesem Fall handeln muss,
    es kann auch ein komplexerer Ausdruck sein.

    Bei der Rückgabe hast Du die Möglichkeit entweder eine anonyme Typen oder auch eine benannte Klasse zu verwenden.
    Hier könnte man eine Instanz erzeugen, die der Klasse in ListAuswertung entspricht - vorausgesetzt die Summen passen in
    den Wertebereich. Für oben:

    Imports System.Linq
    
    Public Class ListAuswertungen
      Public Shared Sub Gruppieren()
        Dim listAuswertung As New List(Of Wert) From {
            New Wert(#4/1/2011#, 1, 2, 3, 4),
            New Wert(#4/1/2011#, 10, 20, 30, 40),
            New Wert(#4/16/2011#, 1000, 2000, 3000, 4000),
            New Wert(#4/21/2011#, 1, 2, 3, 4),
            New Wert(#4/21/2011#, -1, -2, -3, -4),
            New Wert(#4/21/2011#, 1, 2, 3, 4)}
    
        Dim summen = From w In listAuswertung
          Group w By gruppeDatum = w.Datum Into gruppe = Group
          Order By gruppeDatum
          Select Datum = gruppeDatum,
            SummeWert1 = gruppe.Sum(Function(w) w.Wert1),
            SummeWert2 = gruppe.Sum(Function(w) w.Wert2),
            SummeWert3 = gruppe.Sum(Function(w) w.Wert3),
            SummeWert4 = gruppe.Sum(Function(w) w.Wert4)
    
        For Each wert In summen
          Console.WriteLine("{0}: {1}, {2}, {3}, {4}", wert.Datum, wert.SummeWert1, wert.SummeWert2, wert.SummeWert3, wert.SummeWert4)
        Next
    
        ' Wie oben, jedoch wird jeweils eine neue Wert Instanz erzeugt und in einer List(Of Wert) zusammengefasst
        Dim summenListe = (From w In listAuswertung
          Group w By gruppeDatum = w.Datum Into gruppe = Group
          Order By gruppeDatum
          Select New Wert(gruppeDatum,
              gruppe.Sum(Function(w) w.Wert1),
              gruppe.Sum(Function(w) w.Wert2),
              gruppe.Sum(Function(w) w.Wert3),
              gruppe.Sum(Function(w) w.Wert4))).ToList()
    
        For Each wert In summenListe
          Console.WriteLine("{0}: {1}, {2}, {3}, {4}", wert.Datum, wert.Wert1, wert.Wert2, wert.Wert3, wert.Wert4)
        Next
      End Sub
    
      Public Class Wert
        Public Sub New(ByVal datum As Date, wert1 As Decimal, wert2 As Decimal, wert3 As Decimal, wert4 As Decimal)
          Me.Datum = datum
          Me.Wert1 = wert1
          Me.Wert2 = wert2
          Me.Wert3 = wert3
          Me.Wert4 = wert4
        End Sub
    
        Property Datum As Date
        Property Wert1 As Decimal
        Property Wert2 As Decimal
        Property Wert3 As Decimal
        Property Wert4 As Decimal
      End Class
    End Class
    
    
    Weitere Beispiele für LINQ Audrücke findest Du unter 101 Visual Basic-LINQ-Beispiele

    Gruß Elmar

    • Als Antwort markiert DerKim Mittwoch, 13. April 2011 09:04
    Dienstag, 12. April 2011 15:53
    Beantworter

Alle Antworten

  • Hallo Kim,

    vom Prinzip läuft es bei LINQ genauso wie bei SQL.

    In Deiner SQL Anweisung wäre die Datum-Spalte der Gruppierungsschlüssel und so müsste es auch in LINQ sein.
    In der Group stehen alle Instanzen (SQL Zeilen), auf die der Gruppierungsschlüssel zutrifft.
    Auf die darin gelieferten Werte führt man das Summieren aus, in dem man die zu summierenden Eigenschaft
    als Lambda-Ausdruck übergibt. Wobei es sich dabei nicht nur um eine einfache Eigenschaft wie in diesem Fall handeln muss,
    es kann auch ein komplexerer Ausdruck sein.

    Bei der Rückgabe hast Du die Möglichkeit entweder eine anonyme Typen oder auch eine benannte Klasse zu verwenden.
    Hier könnte man eine Instanz erzeugen, die der Klasse in ListAuswertung entspricht - vorausgesetzt die Summen passen in
    den Wertebereich. Für oben:

    Imports System.Linq
    
    Public Class ListAuswertungen
      Public Shared Sub Gruppieren()
        Dim listAuswertung As New List(Of Wert) From {
            New Wert(#4/1/2011#, 1, 2, 3, 4),
            New Wert(#4/1/2011#, 10, 20, 30, 40),
            New Wert(#4/16/2011#, 1000, 2000, 3000, 4000),
            New Wert(#4/21/2011#, 1, 2, 3, 4),
            New Wert(#4/21/2011#, -1, -2, -3, -4),
            New Wert(#4/21/2011#, 1, 2, 3, 4)}
    
        Dim summen = From w In listAuswertung
          Group w By gruppeDatum = w.Datum Into gruppe = Group
          Order By gruppeDatum
          Select Datum = gruppeDatum,
            SummeWert1 = gruppe.Sum(Function(w) w.Wert1),
            SummeWert2 = gruppe.Sum(Function(w) w.Wert2),
            SummeWert3 = gruppe.Sum(Function(w) w.Wert3),
            SummeWert4 = gruppe.Sum(Function(w) w.Wert4)
    
        For Each wert In summen
          Console.WriteLine("{0}: {1}, {2}, {3}, {4}", wert.Datum, wert.SummeWert1, wert.SummeWert2, wert.SummeWert3, wert.SummeWert4)
        Next
    
        ' Wie oben, jedoch wird jeweils eine neue Wert Instanz erzeugt und in einer List(Of Wert) zusammengefasst
        Dim summenListe = (From w In listAuswertung
          Group w By gruppeDatum = w.Datum Into gruppe = Group
          Order By gruppeDatum
          Select New Wert(gruppeDatum,
              gruppe.Sum(Function(w) w.Wert1),
              gruppe.Sum(Function(w) w.Wert2),
              gruppe.Sum(Function(w) w.Wert3),
              gruppe.Sum(Function(w) w.Wert4))).ToList()
    
        For Each wert In summenListe
          Console.WriteLine("{0}: {1}, {2}, {3}, {4}", wert.Datum, wert.Wert1, wert.Wert2, wert.Wert3, wert.Wert4)
        Next
      End Sub
    
      Public Class Wert
        Public Sub New(ByVal datum As Date, wert1 As Decimal, wert2 As Decimal, wert3 As Decimal, wert4 As Decimal)
          Me.Datum = datum
          Me.Wert1 = wert1
          Me.Wert2 = wert2
          Me.Wert3 = wert3
          Me.Wert4 = wert4
        End Sub
    
        Property Datum As Date
        Property Wert1 As Decimal
        Property Wert2 As Decimal
        Property Wert3 As Decimal
        Property Wert4 As Decimal
      End Class
    End Class
    
    
    Weitere Beispiele für LINQ Audrücke findest Du unter 101 Visual Basic-LINQ-Beispiele

    Gruß Elmar

    • Als Antwort markiert DerKim Mittwoch, 13. April 2011 09:04
    Dienstag, 12. April 2011 15:53
    Beantworter
  • Funktioniert!

    Danke für die schnelle Anwort!

     

    Mittwoch, 13. April 2011 09:05