【问题标题】: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 的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      相关资源
      最近更新 更多