Para este ejemplo usaremos la función agruparDatos que recibe por parámetro un DataTable, ya que para este ejemplo usaremos un DataTable.
Public Function agruparDatos(ByVal dt As DataTable) As DataTable
//Declaramos nuestro objeto linq donde en este caso sera un grupo por el campo Fecha
//y los campos en el select hacemos un sum,avg,max para hacer los calculos
//Declaramos nuestro objeto linq donde en este caso sera un grupo por el campo Fecha
//y los campos en el select hacemos un sum,avg,max para hacer los calculos
Dim obj =
From row
In dt
Group row By Fecha = row.Field(Of Date)("Fecha")
Into Merma = Group
Select New With
{
Key Fecha,
.Monto= Merma.Sum(Function(r) r.Field(Of Integer)("Monto")),
.SubTotal= Merma.Sum(Function(r) r.Field(Of Decimal)("SubTotal")),
.Total= Merma.Sum(Function(r) r.Field(Of Integer)("Total")),
.Cantidad= Merma.Sum(Function(r) r.Field(Of Decimal)("Cantidad")),
.Diferencia= Merma.Sum(Function(r) r.Field(Of Decimal)("Diferencia")),
.Porcentaje= Merma.Max(Function(r) r.Field(Of Decimal)("Porcentaje")),
.Promedio= Merma.Avg(Function(r) r.Field(Of Decimal)("Promedio"))
}
//Declaramos nuestro nuevo dt y colonamos la estructura del dt del parámetro
Dim dt2 As DataTable = dt.Clone
//Recorremos el objeto e insertamos las filas al nuevo dt
For i = 0 To obj.Count - 1
Dim dr As DataRow = dt2.NewRow
dr("ID") = i + 1
dr("Fecha") = obj(i).Fecha
dr("Monto") = obj(i).Monto
dr("SubTotal") = obj(i).SubTotal
dr("Total") = obj(i).Total
dr("Total") = obj(i).Total
dr("Cantidad") = obj(i).Cantidad
dr("Diferencia") = Math.Abs(obj(i).Diferencia)
dr("Porcentaje") = obj(i).Porcentaje
dr("Promedio") = obj(i).Promedio
dr("Calculado") = ((dr("Monto") - dr("Diferencia")) / dr("Total")) * 100
Next
//actualizamos el nuevo dt para que se guarden las nuevas filas agregadas
dt2.AcceptChanges()
Return dt2
End Function