首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据单个记录中的int值返回多个行

根据单个记录中的int值返回多个行
EN

Stack Overflow用户
提问于 2013-06-04 19:59:25
回答 1查看 163关注 0票数 1

我有一个包含项目数据的数据库表,每个项目都有一条记录。在下面的一些样本数据中,持续时间以月为单位,目前限制为最大。240,但理论上可以是无限的:

代码语言:javascript
复制
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将返回如下内容,按月排序:

代码语言:javascript
复制
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中可以做这样的事情吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-04 20:32:30

您可以这样做,将一个虚拟的数字范围与其自身连接起来,以获得数字的范围,然后将其添加到基准月份

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16917225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档