2017-05-28 61 views
-1

我有這個模式SQL獲取量在聲明帳戶支付不同的日期

項目

| ItemId | Name | Price | 
|--------|-------|-------| 
| 1 | Item1| 5.00 | 
| 2 | Item2| 2.00 | 

OrderHeader

| OrderId| OrderNum| OrderDate | 
|--------|---------|------------| 
| 1 | ORD1 | 2017-05-10 | 
| 2 | ORD2 | 2017-05-12 | 

訂單明細

|OrderId| ItemId | Total | 
--------|--------|--------- 
| 1 |  1 |  3 | 
| 2 |  1 |  2 | 

我怎樣才能得到這樣的結果:

|ItemId | OrderId | Paid | Debt | 
--------|-----------|---------------- 
| 1 | 1   |  3 | 2 | 
| 1 | 2   |  5 | 0 | 

在結果集中,列支付必須包含總先前的付款,並加上新的。

如何使用公用表表達式來解決此問題?

+0

你在哪裏得到報酬和債務? –

+0

這是我的對賬單,例如,對於第1項有兩個付款(OrderDetails),金額爲3和2,所以在結果中,第一行Paid等於3,債務等於ItemPrice - Paid。在第二行中,Paid是OrderDetails(2)中的新金額加上以前的付款金額(3)等於5. –

+0

而row2債務是第1行債務 - 第2行支付? –

回答

0

這一點,你應該向我們提供:

DECLARE @Item TABLE (Id int, [Name] varchar(15), Price int) 
    DECLARE @OrderDetails TABLE (OrderId int, ItemId int, Total int) 
    INSERT INTO @ITEM VALUES (1, 'ITEM1', 5), (2, 'ITEM2', 2) 
    INSERT INTO @OrderDetails VALUES (1, 1, 3), (2, 1, 2) 

這,似乎工作,我認爲它仍然有改進的餘地:

SELECT OrderId, ItemId, [SUM1], R.Price - [SUM1] 
FROM @OrderDetails AS A 
LEFT JOIN @Item AS R ON A.ItemId = R.Id 
OUTER APPLY (
    SELECT SUM(SUB1.TOTAL) AS [SUM1] 
    FROM @OrderDetails AS SUB1 
    WHERE SUB1.ItemId = A.ItemId AND SUB1.OrderId <= A.OrderId 
) AS B