0

检索按月分组每天的数据记录我有以下结构的表:最有效的方法使用EF 6

| Column Name | Type   | 
|-------------|--------------- | 
| ProjectId | INT   |  
| StartDate | INT   | 
| Amount  | DECIMAL(12, 2) | 

StartDateINT,但它实际上代表了一天,格式为YYYYMMDD

的一个项目(仅工作日存储,没有星期天或星期六)的表存储日常的数值,具体如下:

| ProjectId | StartDate | Amount | 
|-----------|-----------|--------| 
| 1   | 20140926 | 0.5 | 
| 1   | 20140929 | 0.5 | 
| 1   | 20140930 | 0.8 | 
| 1   | 20141001 | 1  |  
| 1   | 20141002 | 1  | 
| 1   | 20141003 | 0.5 | 
| 2   | 20141001 | 0.6 | 
| 2   | 20141002 | 0.5 | 

什么是最有效的方式来获得平均每月值每个项目?我正在使用EF 6(DbContext方法)和SQL Server 2012?我正在寻找使用Linq-to-Entities的解决方案。

理想的结果会是这样的:

| ProjectId | StartDate | Amount | 
|-----------|-----------|--------| 
| 1   | 20140926 | 0.6 | 
| 1   | 20141001 | 0.83 | 
| 2   | 20141001 | 0.55 | 

我有一个解决办法,但我不知道这是最理想的:

var results = dbContext.ProjectValues 
       .GroupBy(pv => 
        new 
        { 
         ProjectId = pv.ProjectId, 
         Year = pv.StartDate.Year, 
         Month = pv.StartDate.Month, 
        }) 
       .Select(g => 
        new 
        { 
         ProjectId = g.Key.ProjectId, 
         StartDate = g.Min(v => v.StartDate), 
         Amount = g.Average(v => v.Amount) 
        }) 
       .ToList(); 

回答

1

你可以做GROUP BY项目ID和月 由于日期存储为int,因此使用转换将其转换为日期

SELECT ProjectID, 
     AVG(Amount) as AverageAmount, 
     DATEADD(MONTH, DATEDIFF(MONTH,0,CAST(CAST(StartDate AS VARCHAR(12)) AS DATE)), 0) 
FROM Table1 
GROUP BY ProjectID, DATEADD(MONTH, DATEDIFF(MONTH,0,CAST(CAST(StartDate AS VARCHAR(12)) AS DATE)), 0) 
+0

虽然SQL代码是正确的,我想要一个使用linq-to-entities的解决方案。 – kjv 2014-10-07 19:06:00

+0

@kjv,明白了。我并不是专家。 – radar 2014-10-07 19:07:26