我在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)
有没有一种简单的方法来获得这个结果?
答案 0 :(得分:1)
首先,在主子查询中,我们找到当前日期的所有值的SUM。然后根据MATURITY
(第二个子查询)将以前日期的值添加到它们中。
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 演示