2012-07-20 14 views
8

mis datos parecen:Linq obtener suma de grupo de datos por fecha

read_date | T1 | T2 | 
15.02.2000 | 2 | 3 | 
16.02.2000 | 4 | 5 | 
15.03.2000 | 2 | 3 | 
16.03.2000 | 5 | 4 | 

quiero conseguir mountly suma de T1 y T2, así:

read_date | T1 | T2 | 
    02.2000 | 6 | 8 | 
    03.2000 | 7 | 7 | 

trato de escribir algo así como esto:

var result = from s in meter_readings.Take(10) 
      group s by new { s.read_date} into g 
      select new 
      { 
       read_date = g.Key.read_date, 
       T1 = g.Sum(x => x.T1), 
       T2 = g.Sum(x => x.T2) 
      }; 

pero esto no da data.Is esperados hay algún ejemplo para dar sumas de datos por hora, sumas diarias, etc.

Gracias

Respuesta

17

Sólo debe tomar el año y el mes en cuenta al agrupar:

var result = 
    from s in meter_readings.Take(10) 
    group s by new { date = new DateTime(s.read_date.Year, s.read_date.Month, 1) } into g 
    select new 
    { 
     read_date = g.Key.date, 
     T1 = g.Sum(x => x.T1), 
     T2 = g.Sum(x => x.T2) 
    }; 
+0

Muchas gracias que trabajo. Para datos diarios, ¿debo escribir "Día" en lugar de "1"? –

+1

@ AliRızaAdıyahşi sí, podría usar 'Day', o podría usar' s.read_date.Date' en lugar de 'new DateTime (s.read_date.Year, s.read_date.Month, s.read_date.Day)', que daría el mismo resultado con menos código. – phoog

+0

¡Impresionante! Gracias por esto. me ayudó! – karbonphyber

0

Su grupo actual agrupará por la fecha completa (es decir, 15.02.2000 en lugar de 02.2000). Eso terminará creando un grupo individual por cada día, no por mes.

añadir un .Month al grupo por (asumiendo que es un objeto de fecha):

group s by new { s.read_date.Month} into g 
+0

Esto solo funciona si los datos no abarcan más de 12 meses; de lo contrario, podría sumar datos de, por ejemplo, enero de 2011 junto con los datos de enero de 2012 ("Mes" para todas esas fechas será "1"). – phoog

5

En primer lugar, cree que puede saltarse el tipo anónimo:

var result = from s in meter_readings.Take(10) 
     group s by s.read_date into g 
     select new 
     { 
      read_date = g.Key, 
      T1 = g.Sum(x => x.T1), 
      T2 = g.Sum(x => x.T2) 
     }; 

en segundo lugar, agrupar por mes, utilice algún valor que UniQ identificar uely el mes, así:

var result = from s in meter_readings.Take(10) 
     group s by s.read_date.ToString("yyyy.MM") into g 
     select new 
     { 
      read_month = g.Key, 
      T1 = g.Sum(x => x.T1), 
      T2 = g.Sum(x => x.T2) 
     }; 
0
static void Main() 
    { 
     var list = new List<meter_reading> 
         { 
          new meter_reading {Date = new DateTime(2000, 2, 15), T1 = 2, T2 = 3}, 
          new meter_reading {Date = new DateTime(2000, 2, 10), T1 = 4, T2 = 5}, 
          new meter_reading {Date = new DateTime(2000, 3, 15), T1 = 2, T2 = 3}, 
          new meter_reading {Date = new DateTime(2000, 3, 15), T1 = 5, T2 = 4} 
         }; 
      var sum = list 
      .GroupBy(x => GetFirstDayInMonth(x.Date)) 
      .Select(item => new meter_reading 
           { 
            Date = item.Key, 
            T1 = item.Sum(x => x.T1), 
            T2 = item.Sum(x => x.T2), 
           }).ToList(); 
    } 

    private static DateTime GetFirstDayInMonth(DateTime dateTime) 
    { 
     return new DateTime(dateTime.Date.Year, dateTime.Date.Month, 1); 
    } 
0
query.OrderBy(o => o.OrderDate) 
       .GroupBy(o => DbFunctions.CreateDateTime(o.OrderDate.Year, o.OrderDate.Month, 1, 0, 0, 0)) 
         .Select(group => new DateIncomeDto { Date = group.Key.Value, Income = group.Sum(item => item.PayFee ?? 0) }); 

Se trabajó para mí!