2015-04-06 61 views
0

在下面的链接表:计算列依赖于前面的行

enter image description here

ТheResult列这是一个T-SQL查询,其中每个记录反映чproduct-modelч的从运动的结果通过账单向另一个账户转账:如果amountemployee转移,则金额将填入Amount_Out列,反之亦然。

例如:行3和4表明,40个产品的hpemp1移动到emp3通过纸币与代码111。此运动将emp1的此产品的总量减少为60,并将emp3的同一产品的总量增加为40

现在我需要在查询来计算每条记录的结果显示产品在员工的保管总量直至记录日期:

结果=所有先前计算的金额账单+ Amount_In - Amount_Out

这意味着结果将取决于以前的记录值。 SQL Server 2008中的查询如何实现?哪个是最好的实现它,存储过程还是视图?

+1

能否请您编辑您的问题,并发布表中的文本,以便我们可以使用它? – StuartLC 2015-04-06 08:03:26

+0

听起来就像一个跑步总数。如果是这样的话,可以提供很多例子。 – 2015-04-06 08:08:35

回答

0

你可以用相关的子查询来做到这一点。更改AND it.No <= ot.NoAND it.Date <= ot.Date如果No s为不连续的:

DECLARE @t TABLE 
    (
     No INT , 
     Employee CHAR(4) , 
     Model CHAR(4) , 
     Date DATE , 
     Bill CHAR(3) , 
     Income MONEY , 
     Outcome MONEY 
    ) 

INSERT INTO @t 
VALUES (1, 'emp1', 'hp', '20140101', '000', 100, 0), 
     (2, 'emp1', 'dell', '20140101', '000', 100, 0), 
     (3, 'emp1', 'hp', '20140308', '111', 0, 40), 
     (4, 'emp3', 'hp', '20140308', '111', 40, 0), 
     (5, 'emp3', 'hp', '20140408', '222', 0, 20), 
     (6, 'emp2', 'hp', '20140408', '222', 20, 0), 
     (7, 'emp1', 'hp', '20140608', '333', 0, 5), 
     (8, 'emp2', 'hp', '20140608', '333', 5, 0), 
     (9, 'emp1', 'dell', '20150101', '444', 0, 40) 


SELECT * , 
     (SELECT SUM(Income - Outcome) 
      FROM  @t it 
      WHERE  it.Model = ot.Model 
        AND it.Employee = ot.Employee 
        AND it.No <= ot.No 
     ) AS Result 
FROM @t ot 

输出:

No Employee Model Date  Bill Income Outcome Result 
1 emp1  hp  2014-01-01 000  100.00 0.00 100.00 
2 emp1  dell 2014-01-01 000  100.00 0.00 100.00 
3 emp1  hp  2014-03-08 111  0.00 40.00 60.00 
4 emp3  hp  2014-03-08 111  40.00 0.00 40.00 
5 emp3  hp  2014-04-08 222  0.00 20.00 20.00 
6 emp2  hp  2014-04-08 222  20.00 0.00 20.00 
7 emp1  hp  2014-06-08 333  0.00 5.00 55.00 
8 emp2  hp  2014-06-08 333  5.00 0.00 25.00 
9 emp1  dell 2015-01-01 444  0.00 40.00 60.00 
0

SQL 2008不能访问到Sql2012的其他分析功能,如超前滞后,所以你需要采取一种解决方法,如these here

下面是一个递归CTE实现的例子。

请注意,这取决于能够在员工,ProductModel分组中连续编号(1,2,3等)而没有任何歧义,因为这用于JOIN条件(Sequence to Sequence + 1 )。例如,如果存在关系,你会得到不稳定的结果。

SqlFiddle here

0

您可以通过一个简单的子查询得到的结果。

SELECT No,Employee,Product_Model,[Date],Bill_Code,Amount_In,Amount_Out, 
(
    SELECT SUM 
    (
     SELECT D1.Amount_In - D0.Amount_Out AS subTotal 
     FROM Table_Name AS D1 
     WHERE 
     (
      D1.[Date] < D0.[Date] 
     ) 
     OR 
     (
      D1.[Date] = D0.[Date] 
      AND 
      D1.No <= D0.No 
     ) 
    ) 
) AS Result 
FROM Table_Name D0 
ORDER BY D0.No, D0.[Date] 

与实际输出应该是:

No Employee Product_Model Date  Bill_Code Amount_In Amount_Out Result 
1 emp1  hp    2014-01-01 000   100.00  0.00   100.00 
2 emp1  dell   2014-01-01 000   100.00  0.00   200.00 
3 emp1  hp    2014-03-08 111   0.00  40.00  160.00 
4 emp3  hp    2014-03-08 111   40.00  0.00   200.00 
5 emp3  hp    2014-04-08 222   0.00  20.00  180.00 
6 emp2  hp    2014-04-08 222   20.00  0.00   200.00 
7 emp1  hp    2014-06-08 333   0.00  5.00   195.00 
8 emp2  hp    2014-06-08 333   5.00  0.00   200.00 
9 emp1  dell   2015-01-01 444   0.00  40.00  160.00 
+0

嗨,@ Jamal3223,你想要什么正确的“结果”列? – 2015-04-06 23:59:58