表具有聚合值,但如果值大于1,我需要返回多行。MySQL如果聚合值大于1,则返回多行
下面是表现在的样子:
date description amount
1/1/2015 alpha 3
1/1/2015 beta 1
这里是我需要它返回:
date description amount
1/1/2015 alpha 1
1/1/2015 alpha 1
1/1/2015 alpha 1
1/1/2015 beta 1
任何帮助将不胜感激。
表具有聚合值,但如果值大于1,我需要返回多行。MySQL如果聚合值大于1,则返回多行
下面是表现在的样子:
date description amount
1/1/2015 alpha 3
1/1/2015 beta 1
这里是我需要它返回:
date description amount
1/1/2015 alpha 1
1/1/2015 alpha 1
1/1/2015 alpha 1
1/1/2015 beta 1
任何帮助将不胜感激。
你需要一个数字表。像这样的作品多达3,可以很容易地扩展:
select t.date, t.description, 1 as amount
from table t join
(select 1 as n union all select 2 union all select 3) n
on n.n <= t.amount;
编辑:
如果您在表中的较大数额足够的行,你可以这样做:
select t.date, t.description, 1 as amount
from table t join
(select @rn := @rn + 1 as n
from table cross join (select @rn := 0) vars
) n
on n.n <= t.amount;
谢谢。当运行这个查询时,即使金额已经是1,它也是乘以记录。此外,金额的范围可以很大,达到数千。是否有一种替代方案不仅限于代码中的增量联合? – jrod2020 2015-02-05 21:08:51
通过切换“<=" to "> =”,我可以在数量已达1时校正乘法记录。但是,我仍然不确定如何避免出现数量值可能明显高于3的情况(除了继续为每个增量值输入联合数据)。 – jrod2020 2015-02-05 21:39:58
对于最后一次编辑,我在'@rn:= 0'附近得到一个语法错误:vars )n ...... – jrod2020 2015-02-05 21:50:39
这工作完美。
选择t.date,t.description,1从表量 吨加入 (选择@Rn:= @Rn + 1正从 表交叉联接(选择@Rn:= 0)瓦尔 ) n on nn < = t.amount;
您应该可以通过在存储过程中构建查询来完成此操作。 – shmosel 2015-02-05 21:23:11
您能否详细说明如何构建该查询? – jrod2020 2015-02-05 21:32:20
今天晚些时候我会看看我是否有时间。但基本思想是通过迭代遍历行和循环使用'amount'来构造一个包含必要数量的'UNION'的字符串,然后使用'PREPARE'和'EXECUTE'运行最终查询。 顺便说一下,是否有任何理由让最终结果集中的“金额”列? – shmosel 2015-02-05 21:39:47