选择ID范围SQL Server之间的合计金额



我有一个表(账户(,类似于:

ACC_ID   Description   ID_1         ID_2       ID_3     ID_4         AMOUNT
100070   INFO1                                                       1236.90
100150   INFO2                                                       1000.00
100170   INFO3                                                       2876.15
100180   INFO4                                                       3549.20
100360   INFO5         100001       100360                           NULL
110080   INFO6                                                       NULL
300010   INFO7                                                       -1418.74
300015   INFO8         100070       300015     400000   710000       NULL
400000   INFO9                                                       NULL                                    
400090   INFO10                                                      1245.00
700500   INFO11        400000       700500                           NULL

我想做的是,当金额为空并且IDS有值时,求和金额,存储在IDS上的值意味着指定的开始和结束(范围(。

考虑到新列将被称为Total,输出将类似于=

ACC_ID      Description      Amount        Total
100070      INFO1            1236.90
100150      INFO2            1000.00
100170      INFO3            2876.15
100180      INFO4            3549.20
100360      INFO5            NULL          8662.25
110080      INFO6            NULL
300010      INFO7            -1418.74
300015      INFO8            NULL          8488.51
400000      INFO9            NULL
400090      INFO10           1245.00
400090      INFO11           NULL          1245.00

注意:当Amount为null并且所有ID都指定了值范围时公式将类似于:SUM(ID_1,ID_2(+SUM(ID_3,ID_4(

这是我正在使用但不起作用的SQL代码,当有4个ID有值时,它甚至不包括公式。

SELECT ACC_ID, Description, Amount, CASE 
WHEN Amount IS NULL THEN CASE 
WHEN ACC_ID BETWEEN ID_1 AND ID_2 THEN SUM(Amount)
END 
ELSE Amount
END TOTAL FROM CTE GROUP BY ACC_ID,Amount,Description,ID_1,ID_2 ORDER BY 
ACC_ID

如有任何协助或帮助,我们将不胜感激。

我想你想要窗口函数:

SELECT ACC_ID, Description, Amount,
(CASE WHEN Amount IS NULL AND (ID_1 IS NOT NULL OR ID_2 IS NOT NULL OR ID_3 IS NOT NULL OR ID_4 IS NOT NULL)
THEN SUM(Amount) OVER (ORDER BY ACC_ID)
END) as Total
FROM CTE 
ORDER BY ACC_ID;
SELECT ACC_ID, Description, Amount, 
(CASE WHEN Amount IS NULL THEN
CASE WHEN ID_1 !='' AND ID_2 !='' AND ID_3 ='' THEN
(SELECT SUM(Amount)
FROM CTE
WHERE ACC_ID <= x.ID_2 and ACC_ID >= x.ID_1)
WHEN ID_1 !='' AND ID_2 !='' AND ID_3 !='' AND ID_4 !='' THEN
(SELECT SUM(Amount)
FROM CTE
WHERE ACC_ID <= x.ID_2 and ACC_ID >= x.ID_1 OR ACC_ID >= x.ID_3 and ACC_ID <= x.ID_4)
END
END) AS Total
FROM CTE x
ORDER BY ACC_ID;

另一个版本,具有一些假设验证,用于同时需要ID_1和ID_2或1/2和3/4

http://sqlfiddle.com/#!9/b2ed80/6

最新更新