我有一个包含项目数据的数据库表,每个项目都有一条记录。在下面的一些样本数据中,持续时间以月为单位,目前限制为最大。240,但理论上可以是无限的:
id name amount start_date duration
1 Project A 9.000 2013-06-24 3
2 Project B 5.000 2013-07-13 2
3 Project C 15.000 2013-08-06 3现在,我希望MySQL返回每个项目的每月金额:金额除以从start_date所在的月份开始的每个月的持续时间。因此,基于以上数据,MySQL将返回如下内容,按月排序:
id name month amount_this_month
1 Project A 2013-06 3.000
1 Project A 2013-07 3.000
2 Project B 2013-07 2.500
1 Project A 2013-08 3.000
2 Project B 2013-08 2.500
3 Project C 2013-08 5.000
3 Project C 2013-09 5.000
3 Project C 2013-10 5.000我看到一些SQL Server的here,建议使用一个充满数字的虚拟表。有谁知道如何在不影响原始数据库结构的情况下做到这一点?
我需要在一个查询中做到这一点(这样就没有临时(mem)表)。这在MySQL中是如何实现的?我看到了一些Oracle通过(虚拟)范围/序列迭代的解决方案,在MySQL中可以做这样的事情吗?
发布于 2013-06-04 20:32:30
您可以这样做,将一个虚拟的数字范围与其自身连接起来,以获得数字的范围,然后将其添加到基准月份
SELECT id, name, DATE_FORMAT(DATE_ADD(start_date, INTERVAL Units.i + Tens.i * 10 + Hundreds.i * 100 MONTH), '%Y-%m') AS `month`, (amount / duration) AS `amount_this_month`
FROM SomeTable
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Units
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Tens
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Hundreds
WHERE (Units.i + Tens.i * 10 + Hundreds.i * 100) < durationhttps://stackoverflow.com/questions/16917225
复制相似问题