Linq to Entities Groupby Dayname累计平均每天

时间:2015-12-27 23:24:15

标签: c# linq date asp.net-mvc-5 linq-to-entities

我有每日购物金额的DB记录。 样本记录如下:

  

14.12.2015 11:00 --- 750,00

     

14.12.2015 14:35 --- 295,00

     

.....有成千上万的14.12.2015

     

15.12.2015 17:45 --- 650,00

     

15.12.2015 18:46 --- 395,00

     

....直到

,还有成千上万的15.12天      

2015年12月24日12:38 --- 675,00   ...

这意味着我有12月14日至24日的11天记录。我想按日期分组记录。所以我使用Linq to Entities命令并获得我想要的结果。

     var dailyList = await db.ShoppingData.Where(c=>StoreId == id)
.Groupby(c=> SqlFunctions.DatePart("dw",c.ShoppindDate))
.Select(o=> new ShowShoppingDailyVM{
    Day = o.Key,
    Turnover = o.DefaultIfEmpty().Sum(a=>a.InvoiceAmount),//Total Turnover
    Avg= o.DefaultIfEmpty().Sum(a=>a.InvoiceAmount) / (What??) //Avg turnover
    Count = o.Count()
    }).ToListAsync();

这给了我

  

1,2,3,4,5,6,7 as days,

     

1200,1450,960 ......作为计数

     

12.500,17.650,18.950 ......作为营业额

在这11天中,我有2个星期一,2个星期二,2个星期三和2个星期四(1个星期五,1个星期六,1个星期日)。 我需要的东西会给我周一的平均营业额。当我使用Average方法时,它将星期一营业额除以星期一计数(实际上是CartAverage)。 但实际上我需要获得周一营业额/周一计数(2周一不是1200笔交易)

如何获得每日金额的累积平均值?

2 个答案:

答案 0 :(得分:2)

也许是这样的?

var dailyList = await db.ShoppingData.Where(c=>StoreId == id)
    .GroupBy(c=> SqlFunctions.DatePart("dw",c.ShoppindDate))
    .Select(o=> new ShowShoppingDailyVM
                  {
                      Day = o.Key,
                      Turnover = o.DefaultIfEmpty().Sum(a=>a.InvoiceAmount),
                      Avg = o.DefaultIfEmpty().Sum(a=>a.InvoiceAmount)
                               /o.Select(d => d.ShoppindDate).Distinct().Count()
                      Count = o.Count()
                  })
    .ToListAsync();

答案 1 :(得分:0)

我想我已经解决了。我再次分组了#34;分组日#34;按周计算,我将总营业额除以周数周数。

以下是工作代码:

     var dailyList = await db.ShoppingData.Where(c=>StoreId == id)
    .Groupby(c=> SqlFunctions.DatePart("dw",c.ShoppindDate))
    .Select(o=> new ShowShoppingDailyVM{
        Day = o.Key,
        Turnover = o.DefaultIfEmpty().Sum(a=>a.InvoiceAmount),//Total Turnover
        //Avg= o.DefaultIfEmpty().Sum(a=>a.InvoiceAmount) / (What??) //Avg turnover
       Avg = o.DefaultIfEmpty().Sum(a=>a.InvoiceAmount) / (decimal) o.GroupBy(a=>
       SqlFunctions.DatePart("week",c.ShoppindDate)).Count(),
        Count = o.Count()
        }).ToListAsync();

这正是我所需要的。按天分组,然后在分组的日期内按周分组。 2015年12月14日和2015年12月21日给我星期一和星期2。 (一年中的51.和52.周)