2013-10-21 3 views
1

다음과 같은 쿼리를 사용하여 포트폴리오의 일일 총 가치를 제공합니다.SUM과 이전 SUM, GROUP BY 불연속 날짜의 차이를 계산하는 쿼리

SELECT RecDate, Sum(Mval) as TotalVal 
FROM DailyVal 
WHERE RecDate >= DateValue("1/1/2013") 
GROUP BY RecDate; 

그것은 잘 작동하고 다음과 같은 결과를 얻을 : 나는 1/11/20131/10/2013 등 모든 행에 대해 말의 차이를 계산하고 싶습니다 그러나

RecDate TotalVal 
1/10/2013 4465 
1/11/2013 4471 
1/14/2013 4472 
1/15/2013 4477 

.

일반적으로 ONID - 1이라는 별칭을 사용하여 테이블에 INNER JOIN을 입력하고 원하는대로 계산을 수행합니다. 안타깝게도 집계 할 때 GROUP BY에 해당하는 색인은 없습니다.

ID RecDate TotalVal 
1 1/10/2013 4465 
2 1/11/2013 4471 
3 1/14/2013 4472 
4 1/15/2013 4477 

내 정상적인 접근 방식을 취할 수있는 방법을 : 그것은처럼 보일 수 있도록 내 질문이 될 것

실제로 쿼리에 인덱스를 줄 수있는 방법이있다.

그렇지 않으면이 작업을 수행하는보다 효율적인 방법이 있습니까?

답변

0

당신은 하위 쿼리와 함께 할 수있을 것 자체 조인 :

SELECT 
    D1.RecDate, 
    TotalVal, 
    TotalVal - NZ(TotalVal2,0) Delta 
FROM (
    SELECT RecDate, Sum(Mval) as TotalVal 
    FROM DailyVal 
    WHERE RecDate >= DateValue("1/1/2013") 
    GROUP BY RecDate) D1 
LEFT JOIN (
    SELECT RecDate, Sum(Mval) as TotalVal2 
    FROM DailyVal 
    WHERE RecDate >= DateValue("1/1/2013") 
    GROUP BY RecDate) D2 
ON D2.RecDate = (SELECT MAX(RecDate) FROM DailyVal WHERE RecDate < D1.RecDate) 

;