【问题标题】:Repeat records according to a quantity field根据数量字段重复记录
【发布时间】:2013-12-29 21:03:47
【问题描述】:
我有一张我从客户那里收到的 Excel 表,我被导入到 Access 中,我会调用该表 [tblCustomer],它看起来像这样:
ProductID Name Expire date SumofQty
------------ ----------- --------------- --------
3 Flour 13-Dec-2013 6
6 Meat 20-Jan-2014 10
所以该表可能包含 100 个项目。我希望在同一个表或另一个表中按照 SumofQty 复制相同的记录 6 次,而不是下一条记录复制 10 次,依此类推。
我需要这个,因为我现在要手动为每个产品创建标签。
【问题讨论】:
标签:
ms-access
vba
ms-access-2010
【解决方案1】:
您可以使用“数字表”在查询中轻松做到这一点。在您的数据库中创建一个名为 [Numbers] 的表,该表由一个名为 [n] 的字段类型为 Numeric (Long Integer) 的单个字段组成。在该表中创建值为 1、2、3、... 的行,其值远远超过您在 [tblCustomer].[SumofQty] 中看到的最大值。在我的测试中,我使用了 2500,所以我的 [Numbers] 表看起来像
n
----
1
2
3
...
2499
2500
然后,对于表 [tblCustomer] 中的示例数据
ProductID Name Expire date SumofQty
--------- ----- ----------- --------
3 Flour 2013-12-13 6
6 Meat 2014-01-20 10
查询
SELECT tblCustomer.*
FROM
tblCustomer
INNER JOIN
Numbers
ON Numbers.n <= tblCustomer.SumofQty
返回
ProductID Name Expire date SumofQty
--------- ----- ----------- --------
3 Flour 2013-12-13 6
3 Flour 2013-12-13 6
3 Flour 2013-12-13 6
3 Flour 2013-12-13 6
3 Flour 2013-12-13 6
3 Flour 2013-12-13 6
6 Meat 2014-01-20 10
6 Meat 2014-01-20 10
6 Meat 2014-01-20 10
6 Meat 2014-01-20 10
6 Meat 2014-01-20 10
6 Meat 2014-01-20 10
6 Meat 2014-01-20 10
6 Meat 2014-01-20 10
6 Meat 2014-01-20 10
6 Meat 2014-01-20 10
【讨论】:
-
请注意,您可以通过使用生成数字序列的查询来避免使用数字表,如 here 提供的那样。但是,这会增加运行查询所需的时间。
【解决方案2】:
这是使用 Erik von Asmuth 的评论的解决方案,该评论指出了 Gustav 最初创建的答案。
SELECT t.*
FROM tblCustomer AS t
INNER JOIN (SELECT DISTINCT
[Hundreds]+[Tens]+[Ones] AS Factor,
100*Abs(Hundo.id Mod 10) AS Hundreds,
10*Abs(Deca.id Mod 10) AS Tens,
Abs(Uno.id Mod 10) AS Ones
FROM
msysobjects AS Uno,
msysobjects AS Deca,
msysobjects As Hundo
WHERE Abs(Deca.id Mod 10) <> 0
or Abs(Uno.id Mod 10) <> 0
or Abs(Hundo.id Mod 10) <> 0) AS sq on sq.Factor <= t.SumofQty
我还添加了数百列,因为我想我可能会需要它。我的方法还在子查询中过滤掉 0,否则我会得到 2 行的数量为 1 的东西。