我有一个包含项目数据的数据库表,每个项目都有一条记录。在一些样本数据下面,持续时间以月为单位,目前仅限于最大值。 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中执行类似的操作?
答案 0 :(得分:1)
您可以执行以下操作,将虚拟数字范围与自身连接以获取数字范围,然后将其添加到基准月
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) < duration