暂时想到这种USE tempdb
GOCREATE TABLE #TmpTb
(
房间代码  VARCHAR(50),
日期   DATETIME,
合计   MONEY,
退款   MONEY,
余额   MONEY
)INSERT INTO #TmpTb
        ( 房间代码,日期, 合计, 退款, 余额 )
SELECT 'ROOM1', '2015-02-05',32780,NULL,NULL
UNION ALL
SELECT 'ROOM1','2015-02-06', 0,100,-100
UNION ALL
SELECT 'ROOM1','2015-02-07', 0,200,-200
SELECT 房间代码,
日期,
SUM(ISNULL(合计,0)) OVER (PARTITION BY 房间代码) AS [合计],
ISNULL(a.退款,0) AS 退款,
SUM(ISNULL(合计,0)) OVER (PARTITION BY 房间代码) - b.退款 AS 余额
FROM #TmpTb a
CROSS APPLY (SELECT SUM(ISNULL(退款,0)) AS 退款 FROM #TmpTb 
WHERE 房间代码=a.房间代码 AND 日期 <= a.日期) AS b

解决方案 »

  1.   

    ;WITH TAB AS(
    SELECT ROW_NUMBER()over(PARTITION BY 房间代码 ORDER BY (SELECT 0)) AS ID
    ,房间代码,日期,合计,退款金额,余额 FROM 租赁表
    )
    SELECT DISTINCT A.ID,A.房间代码,A.日期
    ,MAX(A.合计)OVER() - SUM(ISNULL(B.退款金额,0))OVER(PARTITION BY A.ID) +ISNULL(A.退款金额,0) AS 合计
    ,ISNULL(A.退款金额,0) AS 退款金额
    ,MAX(A.合计)OVER() - SUM(ISNULL(B.退款金额,0))OVER(PARTITION BY A.ID) AS 余额
    FROM TAB A LEFT JOIN TAB B ON A.ID > B.ID-1