1

我在 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

4 回答 4

1

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

SQLFiddle 演示

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
于 2013-08-14T14:00:03.680 回答
0

我不确定这是否是您正在寻找的,也许如果您提供更多详细信息

select
   DATE
   ,sum(VALUE) as OUTSTANDING_AMOUNT
from
  NameOfYourTable

group by 
   DATE
Order by
   DATE

我希望这有帮助

于 2013-08-14T13:26:32.627 回答
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

输出:

| 日期 | OUTSTANDING_AMOUNT |
-----------------------------------------
| 1 | 25 |
| 2 | 35 |
| 3 | 15 |

这是SQLFiddle演示

于 2013-08-14T14:15:17.160 回答
0

Each date considers each row for inclusion in the summation of value

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
于 2013-08-14T13:59:05.753 回答