1

我有一个包含项目数据的数据库表,每个项目都有一条记录。在一些示例数据下方,持续时间以月为单位,目前限制为最大值。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 的东西,建议使用一个填充了数字的虚拟表。有人对如何在不影响原始数据库结构的情况下执行此操作有任何想法吗?

我需要在一个查询中执行此操作(因此没有临时(内存)表)。这在 MySQL 中怎么可能?我看到了 Oracle 的一些解决方案来遍历(虚拟)范围/序列,是否可以在 MySQL 中做这样的事情?

4

1 回答 1

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
于 2013-06-04T12:32:29.537 回答