【问题标题】:Linq get sum of data group by dateLinq 按日期获取数据组的总和
【发布时间】:2012-07-20 07:05:52
【问题描述】:

我的数据如下:

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

我想得到 T1 和 T2 的总和,像这样:

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

我试着写这样的东西:

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)
             };

但这并没有给出预期的数据。有没有给出数据每小时总和,每日总和等的例子。

谢谢

【问题讨论】:

    标签: c# linq group-by sum


    【解决方案1】:

    分组时只应考虑年份和月份:

    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)
        };
    

    【讨论】:

    • 非常感谢我的工作。对于每日数据,我应该写“Day”而不是“1”吗?
    • @AliRızaAdıyahşi 是的,您可以使用Day,或者您可以使用s.read_date.Date 而不是new DateTime(s.read_date.Year, s.read_date.Month, s.read_date.Day),这样可以用更少的代码得到相同的结果。
    • 太棒了!谢谢你。它帮助了我!
    • 非常感谢!
    • 我想知道下面的查询是否有一些东西,我的意思是按第一列分组:Select date_format(LogDate,'%Y-%m-%d'), sum(duration) from my_duration_table group by 1;
    【解决方案2】:

    首先,我认为你可以跳过匿名类型:

    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) 
             };
    

    其次,按月分组,使用一些可以唯一标识月份的值,如下所示:

    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) 
             };
    

    【讨论】:

      【解决方案3】:

      您当前的分组依据将按完整日期分组(即 15.02.2000 而不是 02.2000)。这最终会为每天而不是每月创建一个单独的组。

      将 .Month 添加到组中(假设它是一个日期对象):

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

      【讨论】:

      • 这仅适用于数据不超过 12 个月的情况;否则,它可以将 2011 年 1 月的数据与 2012 年 1 月的数据相加(Month,所有这些日期都是1)。
      【解决方案4】:
          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);
          }
      

      【讨论】:

        【解决方案5】:
        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) });
        

        它对我有用!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-27
          • 1970-01-01
          • 1970-01-01
          • 2019-11-19
          相关资源
          最近更新 更多