Benutzer mit den meisten Antworten
Linq - Summierung von mehreren Spalten

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).tolistHat das von Euch schon jemand gemacht?
Gruß
Kim
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:Weitere Beispiele für LINQ Audrücke findest Du unter 101 Visual Basic-LINQ-BeispieleImports 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
Gruß Elmar
- Als Antwort markiert DerKim Mittwoch, 13. April 2011 09:04
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:Weitere Beispiele für LINQ Audrücke findest Du unter 101 Visual Basic-LINQ-BeispieleImports 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
Gruß Elmar
- Als Antwort markiert DerKim Mittwoch, 13. April 2011 09:04