gpt4 book ai didi

mysql - 根据单个记录的 int 值返回多行

转载 作者:行者123 更新时间:2023-11-29 00:30:19 24 4
gpt4 key购买 nike

我有一个包含项目数据的数据库表,每个项目都有一条记录。在一些示例数据下方,持续时间以月为单位,目前限制为最大值。 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

我看到了一些东西here对于 SQL Server,建议使用填充数字的虚拟表。任何人对如何在不影响原始数据库结构的情况下执行此操作有任何想法?

我需要在一个查询中执行此操作(因此没有临时 (mem) 表)。这在 MySQL 中怎么可能?我看到 Oracle 的一些解决方案通过(虚拟)范围/序列进行迭代,是否可以在 MySQL 中执行类似的操作?

最佳答案

你可以这样做,将一个虚拟数字范围与自身相结合以获得数字范围,然后将其添加到基月

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

关于mysql - 根据单个记录的 int 值返回多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16917225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com