运行总SQL服务器 - AGAIN

时间:2014-03-28 09:37:21

标签: sql sql-server

我知道这个问题已经被多次询问了,我已经阅读了那些线程来到达我现在的位置,但这些解决方案似乎并没有起作用。我需要运行我的ExpectedAmount ...

我有下表:

+--------------+----------------+
| 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 |
+--------------+----------------+

我有以下SQL:

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

上述SQL的结果如下:

+--------------+----------------+--------------+
| 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 |
+--------------+----------------+--------------+

你可以从前几个值中看出数学已全部关闭,但是在某些时候数学加起来了?!我太困惑了!!有人可以指点我另一个解决方案或我错在哪里吗?

我正在使用SQL Server 2008。

2 个答案:

答案 0 :(得分:4)

这是因为您的ExpectedDate列类型为varchar。试试这个:

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

请注意,这可能是效率低下的查询。

答案 1 :(得分: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