2014-04-21 3 views
1

매일 매일 계정을 기준으로 잔액 변경 결과가 저장된 임시 테이블이 있습니다.누적 합계 데이터 열

DateValue DailyAmount 
---------- --------------------------------------- 
2014-04-21 0.00 
2014-04-22 606.28 
2014-04-23 -70.00 
2014-04-24 -86.96 
2014-04-25 -101.01 
2014-04-26 -27.00 
2014-04-27 0.00 
2014-04-28 -75.00 
2014-04-29 -12.00 
2014-04-30 0.00 
2014-05-01 -164.00 
2014-05-02 -49.95 
2014-05-03 0.00 
2014-05-04 0.00 
2014-05-05 -140.00 
2014-05-06 538.23 
2014-05-07 -70.00 
2014-05-08 223.04 
2014-05-09 0.00 
2014-05-10 -50.00 
2014-05-11 0.00 
2014-05-12 -140.00 
2014-05-13 -12.00 
2014-05-14 0.00 
2014-05-15 6179.81 

나는이 테이블에서 내가 선택한 여는 균형 변수를 기반으로 실행중인 저울을 추가해야합니다.

Dateadd (DAY, -1, Datefield)를 사용하여 선택하는 것이 안전할까요?

내 시도가 실패 (잘못된 결과)이이었다

SELECT DateValue, ISNULL(r.Amount,0) AS DailyAmount, SUM(ISNULL(r.Amount,0)) 
FROM calendar c 
LEFT JOIN @Result r 
ON r.TheDate = c.DateValue 
LEFT JOIN @Result r2 
ON r2.TheDate = DATEADD(day, -1, r.TheDate) 
WHERE c.DateValue BETWEEN @Start AND @End 
GROUP BY c.DateValue, r.Amount 

SQL 버전은 마이크로 소프트 SQL 서버 2008 R2를 (SP2)

+2

SQL Server 버전은 무엇입니까? –

+1

시도한 코드 나 원하는 결과를 추가하여 구체적인 문제를 명확히하십시오. 현재 작성된 내용이므로 귀하가 원하는 내용을 정확하게 말하기는 어렵습니다. How to Ask 페이지에서이 질문에 대한 설명을 참조하십시오. – Kermit

+0

이 질문은 중복 될 수 있습니다. http://stackoverflow.com/a/1154139/3430807 – Andreas

답변

2

SQL에서 실행중인 총을 얻을 수있는 일반적인 방법은을 사용하는 것입니다 상관 하위 쿼리 :

select r.*, 
     (select sum(r2.DailyAmount) 
     from @Result r2 
     where r2.DateValue <= r.DateValue 
     ) as CumSum 
from @Result r; 

일치하는 고객과 같이 하위 쿼리에 추가 조건이 필요할 수 있습니다. SQL Server 2012는 누적 합계를 직접 지원합니다.

+0

완벽한! 고든 고마워. – Craig

+0

오케이. 소위'Corrleated subqueries'. Link - http://beginner-sql-tutorial.com/sql-subquery.htm –

+0

Gordon 날짜가 오름차순이 아닌 경우이 쿼리가 작동하지 않는지 확인했습니다. 이 경우 쿼리를 계속 사용할 수 있습니까? @Result = My Sales 테이블. 내 쿼리'CREATE TABLE ## Sold ( [DateValue] [datetime] NULL, [DailyAmount] [십진수] (18, 2) NULL 에 삽입 ## 판매 선택한 상위 10 *에서 판매 에 의해 DailyAmount desc 선택 * ##에서 판매 선택 R * (SUM (r2.DailyAmount) 을 선택에서 ## R2 판매 여기서 r2.DateValue <= r.DateValue ) CumSum 등으로부터 판매 R ##]. ' –

0

SQLPerformace.com에 총계를 실행하기위한 다양한 전략에 대한 꽤 광범위한 논의가 있습니다.

성능이 문제가되지 않으므로 모든 솔루션보다 일일 항목이 적은 경우. 고든은 다른 것을 보여줄거야.

;WITH x AS 
(
    SELECT TOP 1 
     DateValue 
     ,DailyAmount 
     ,RunningTotal = DailyAmount 
     FROM #Result 
     ORDER BY DateValue ASC 
    UNION ALL 
    SELECT y.DateValue 
     ,y.DailyAmount 
     ,x.RunningTotal + y.DailyAmount 
     FROM x 
     INNER JOIN 
     #Result y ON y.DateValue = DATEADD(DAY, 1, x.DateValue) 
) 
SELECT DateValue 
     ,DailyAmount 
     ,RunningTotal 
    FROM x 
    ORDER BY DateValue 
OPTION (MAXRECURSION 10000)