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

+0

@kjv, 알겠습니다. 나는 linq-to-entities 전문가가 아니다. – radar

관련 문제