在MySQL中计算未付金额

时间:2013-08-14 13:21:29

标签: mysql select

我在MySQL中遇到SELECT命令的问题。我有一个每日交换的证券数据库,其成熟期为1至1000天(> 1 mio行)。我想获得每天的未付金额(可能是每个类别)。举个例子,假设这是我的初始数据集:

DATE    VALUE    MATURITY
1       10       3       
1       15       2
2       10       1
3       5        1

我想获得以下输出

DATE    OUTSTANDING_AMOUNT
1       25
2       35
3       15

未偿还金额按交换的证券总数仍然“活着”计算。这意味着,在第2天有一个新的交易所10和两个旧的交易所(10和15)仍然未偿还,因为他们的到期日超过一天,在第2天的总未付金额为35.在第3天而不是从10日的第1天开始换新5和旧交换。也就是说,未付金额的15。

这是一个更直观的解释:

Monday      Tuesday     Wednesday
10          10          10             (Day 1, Value 10, matures in 3 days)
15          15                         (Day 1, 15, 2 days)
            10                         (Day 2, 10, 1 day)
                        5              (Day 3, 5, 3 days with remainder not shown)
-------------------------------------
25          35          15             (Outstanding amount on each day)

有没有一种简单的方法来获得这个结果?

4 个答案:

答案 0 :(得分:1)

首先,在主子查询中,我们找到当前日期的所有值的SUM。然后根据MATURITY(第二个子查询)将以前日期的值添加到它们中。

SQLFiddle demo

select T1.Date,T1.SumValue+
IFNULL((select SUM(VALUE) 
          from T 
          where 
             T1.Date between 
                T.Date+1 and T.Date+Maturity-1 )
       ,0)
FROM
(
   select Date,
       sum(Value) as SumValue
   from T
   group by Date
) T1
order by DATE

答案 1 :(得分:0)

我不确定这是否是您正在寻找的,也许您会提供更多细节

select
   DATE
   ,sum(VALUE) as OUTSTANDING_AMOUNT
from
  NameOfYourTable

group by 
   DATE
Order by
   DATE

我希望这会有所帮助

答案 2 :(得分:0)

每个日期都会考虑包含在值总和中的每一行

SELECT d.DATE, SUM(m.VALUE) AS OUTSTANDING_AMOUNT
FROM yourTable AS d JOIN yourtable AS m ON d.DATE >= m.MATURITY
GROUP BY d.DATE
ORDER BY d.DATE

答案 3 :(得分:0)

带有计数(数字)表的可能解决方案

SELECT date, SUM(value) outstanding_amount
  FROM
(
  SELECT date + maturity - n.n date, value, maturity
    FROM table1 t JOIN
  (
    SELECT 1 n UNION ALL
    SELECT 2 UNION ALL 
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5 
  ) n ON n.n <= maturity
) q
 GROUP BY date

输出:

| DATE | OUTSTANDING_AMOUNT |
-----------------------------
|    1 |                 25 |
|    2 |                 35 |
|    3 |                 15 |

这是 SQLFiddle 演示