2016-12-06 14 views
2

表A如何使用SQL窗口函數與if條件來計算金額?

╔═════╦════════════╦════════╗ 
║ ID ║ Date ║ Amount ║ 
╠═════╬════════════╬════════╣ 
║ 100 ║ 01/07/2016 ║  50 ║ 
║ 100 ║ 02/07/2016 ║  60 ║ 
║ 100 ║ 03/07/2016 ║  70 ║ 
║ 100 ║ 04/07/2016 ║ 100 ║ 
║ 100 ║ 05/07/2016 ║ 450 ║ 
║ 101 ║ 01/07/2016 ║  50 ║ 
║ 101 ║ 02/07/2016 ║  70 ║ 
║ 101 ║ 03/07/2016 ║ 150 ║ 
║ 102 ║ 01/07/2016 ║  30 ║ 
║ 102 ║ 02/07/2016 ║  40 ║ 
║ 102 ║ 03/07/2016 ║  60 ║ 
║ 104 ║ 01/07/2016 ║ 200 ║ 
║ 104 ║ 02/07/2016 ║ 300 ║ 
║ 104 ║ 03/07/2016 ║ 500 ║ 
╚═════╩════════════╩════════╝ 

表B

╔═════╦════════════╦════════════╗ 
║ ID ║ Date ║ MoveAmount ║ 
╠═════╬════════════╬════════════╣ 
║ 100 ║ 01/07/2016 ║  260 ║ 
║ 100 ║ 02/07/2016 ║  400 ║ 
║ 101 ║ 02/07/2016 ║   30 ║ 
║ 101 ║ 03/07/2016 ║   70 ║ 
║ 103 ║ 02/07/2016 ║   10 ║ 
║ 104 ║ 02/07/2016 ║  200 ║ 
╚═════╩════════════╩════════════╝ 

結果

如何腳本來得到我想要的結果嗎?

條件:

1)如果來自表A和表B中的分鐘日期是一致的,再總結所有的表B中減去所有量與表B中的分鐘(日期)的量,ELSE總和從表B.

2)的量。然後比較量最大(日)總和 - 分(日期)在表A

+0

您可以將ID 102添加到表A,ID 103添加到表B並調整結果? – jarlh

+2

請不要張貼圖片!嘗試設置一個[MCVE](http://stackoverflow.com/help/mcve),或者 - 至少 - 編輯你的問題,並使樣本數據copy'n'pasteable ... – Shnugo

+0

我會使用'FIRST_VALUE '和'LAST_VALUE'以及很少的'GROUP BYs'。 –

回答

0

我想很少跨應用可以做的伎倆。祝你好運,如果有什麼聰明的方法來做到這一點!

SELECT DISTINCT id, resOfA, resOfB FROM t1 AS src 
CROSS APPLY (
    SELECT TOP 1 (resA.maxAmt-resA.minAmt) AS resOfA FROM t1 
    CROSS APPLY (
        SELECT (SELECT amount FROM t1 WHERE id=src.id AND date = (SELECT max(date) FROM t1 WHERE id=src.id)) AS maxAmt, 
        (SELECT amount FROM t1 WHERE id=src.id AND date = (SELECT min(date) FROM t1 WHERE id=src.id)) AS minAmt 
       ) AS resA 
    WHERE src.id = id  
) 
CROSS APPLY (
    SELECT TOP 1 (resB.sumAmt - resB.minAmt) as resOfB FROM t2 
    CROSS APPLY (
        SELECT (select SUM(amount) FROM t2 WHERE id=src.id) as maxAmt, 
        (SELECT amount FROM t2 where id=src.id AND date = (SELECT min(date) FROM t2 WHERE id=src.id)) AS minAmt, 
       ) AS resB 
    WHERE src.id = id 
) 
+0

謝謝你們! –

+0

np :)在SQL中玩得開心! – SKLTFZ