2014-03-28 3 views
0

나는이 질문이 여러 번 요청되었으며 내가 지금 어디에 있는지 알기 위해 이러한 스레드를 읽었지만 이러한 솔루션은 작동하지 않는 것으로 알고 있습니다.누적 합계 SQL 서버 - 다시

SELECT a.ExpectedDate, a.ExpectedAmount, (SELECT SUM(b.ExpectedAmount) 
         FROM UnpaidManagement..Expected b 
         WHERE b.ExpectedDate <= a.ExpectedDate) 
FROM UnpaidManagement..Expected a 

위의 SQL의 결과는 : 나는 다음과 같은 SQL 한

+--------------+----------------+ 
| ExpectedDate | ExpectedAmount | 
+--------------+----------------+ 
|   1 |  2485513 | 
|   2 |   526032 | 
|   3 |   342041 | 
|   4 |   195807 | 
|   5 |   380477 | 
|   6 |   102233 | 
|   7 |   539951 | 
|   8 |   107145 | 
|   10 |   165110 | 
|   11 |   18795 | 
|   12 |   27177 | 
|   13 |   28232 | 
|   14 |   154631 | 
|   15 |  5566585 | 
|   16 |   250814 | 
|   17 |   90444 | 
|   18 |   105424 | 
|   19 |   62132 | 
|   20 |  1799349 | 
|   21 |   303131 | 
|   22 |   459464 | 
|   23 |   723488 | 
|   24 |   676514 | 
|   25 |  17311911 | 
|   26 |  4876062 | 
|   27 |  4844434 | 
|   28 |  4039687 | 
|   29 |  1418648 | 
|   30 |  4366189 | 
|   31 |  9028836 | 
+--------------+----------------+ 

: 나는

내가 다음 표를 가지고 ... 내 ExpectedAmount의 누계이 필요합니다 이 :

+--------------+----------------+--------------+ 
| ExpectedDate | ExpectedAmount | RunningTotal | 
+--------------+----------------+--------------+ 
|   1 |  2485513 |  2485513 | 
|   2 |   526032 |  9480889 | 
|   3 |   342041 |  46275618 | 
|   4 |   195807 |  59866450 | 
|   5 |   380477 |  60246927 | 
|   6 |   102233 |  60349160 | 
|   7 |   539951 |  60889111 | 
|   8 |   107145 |  60996256 | 
|   10 |   165110 |  2650623 | 
|   11 |   18795 |  2669418 | 
|   12 |   27177 |  2696595 | 
|   13 |   28232 |  2724827 | 
|   14 |   154631 |  2879458 | 
|   15 |  5566585 |  8446043 | 
|   16 |   250814 |  8696857 | 
|   17 |   90444 |  8787301 | 
|   18 |   105424 |  8892725 | 
|   19 |   62132 |  8954857 | 
|   20 |  1799349 |  11280238 | 
|   21 |   303131 |  11583369 | 
|   22 |   459464 |  12042833 | 
|   23 |   723488 |  12766321 | 
|   24 |   676514 |  13442835 | 
|   25 |  17311911 |  30754746 | 
|   26 |  4876062 |  35630808 | 
|   27 |  4844434 |  40475242 | 
|   28 |  4039687 |  44514929 | 
|   29 |  1418648 |  45933577 | 
|   30 |  4366189 |  50641807 | 
|   31 |  9028836 |  59670643 | 
+--------------+----------------+--------------+ 

처음 몇 가지 값에서 이미 수학이 모두 꺼져 있지만 s 오메 포인트는 수학이 합쳐진다는 것을 요?! 나는 너무 혼란 스럽다 !! 누군가 나에게 다른 해결책을 가르쳐 주시겠습니까? 나는 SQL 서버를 사용하고

는 2008 년

답변

4

은 VARCHAR 유형의 당신의 ExpectedDate 열 때문이다. 시도해보십시오.

SELECT a.ExpectedDate, a.ExpectedAmount, (SELECT SUM(b.ExpectedAmount) 
         FROM UnpaidManagement..Expected b 
         WHERE CAST(b.ExpectedDate as int) <= CAST(a.ExpectedDate as int)) 
FROM UnpaidManagement..Expected a 

쿼리가 비효율적 일 수 있습니다.

+0

앗 당신이 챔피언! 참으로 VARCHAR, yikes !! 정말 고마워요 ... 이것으로 정리했습니다. – Mike

0

나는이 거 일을 생각 :

SELECT a.ExpectedDate, 
     a.ExpectedAmount, 
     SUM(b.ExpectedAmount) RuningTotal 
FROM UnpaidManagement..Expected a 
LEFT JOIN UnpaidManagement..Expected b 
    ON CAST(b.ExpectedDate as int) <= CAST(a.ExpectedDate as int) 
GROUP BY a.ExpectedDate, a.ExpectedAmount 

과를 :

SELECT a.ExpectedDate, 
     a.ExpectedAmount, 
     c.RuningTotal 
FROM UnpaidManagement..Expected a 
CROSS APPLY (
    SELECT SUM(b.ExpectedAmount) AS RuningTotal 
    FROM UnpaidManagement..Expected b 
    WHERE CAST(b.ExpectedDate as int) <= CAST(a.ExpectedDate as int) 
) c