我们应该能够在不使用循环代码的情况下完成您需要的事情。
(我假设您的临时表名为 [mailsort],其自动编号主键名为 [ID]。)
要分配 [sub_id] 值,我们可以使用古老的自联接技巧。此查询将使用值创建一个名为 [tmpSub_IDs] 的临时表
SELECT t1.mailsort_code, t1.ID, COUNT(*) AS sub_id
INTO tmpSub_IDs
FROM
mailsort t1
INNER JOIN
mailsort t2
ON t2.mailsort_code = t1.mailsort_code
AND t2.ID <= t1.ID
GROUP BY t1.mailsort_code, t1.ID
这个查询会将这些值复制到 [mailsort] 表中
UPDATE
mailsort
INNER JOIN
tmpSub_IDs
ON tmpSub_IDs.ID = mailsort.ID
SET mailsort.sub_id = tmpSub_IDs.sub_id
所以现在我们的 [mailsort] 表看起来像
ID mailsort_code sub_id bag_no
--- ------------- ------ ------
1 12345 1
2 12345 2
3 12345 3
...
450 12345 450
451 23456 1
...
现在我们需要计算出每个袋子的字母数量。假设我们有相关的表 [mailsort_codes] 包含
mailsort_code weight_g letters_per_bag
------------- -------- ---------------
12345 55
23456 65
mailsort_code=12345 的每个字母重 55 克,将其分成 10 公斤给出
10000 / 55 = 181.81
我们必须截断(而不是四舍五入)它,所以我们可以有
Int(10000 / 55) = 181
该 mailsort_code 的每袋字母。让我们更新 [mailsort_codes] 中的那一列
UPDATE mailsort_codes
SET letters_per_bag = Int(10000 / weight_g)
给我们
mailsort_code weight_g letters_per_bag
------------- -------- ---------------
12345 55 181
23456 65 153
现在,要分配包编号,我们只需除以(sub_id - 1)
并letters_per_bag
四舍五入到下一个最大整数 ( Int(x + 1)
)
UPDATE
mailsort
INNER JOIN
mailsort_codes
ON mailsort_codes.mailsort_code = mailsort.mailsort_code
SET mailsort.bag_no = Int(((mailsort.sub_id - 1) / mailsort_codes.letters_per_bag) + 1)
我们有
ID mailsort_code sub_id bag_no
--- ------------- ------ ------
1 12345 1 1
2 12345 2 1
3 12345 3 1
...
181 12345 181 1
182 12345 182 2
...
362 12345 362 2
363 12345 363 3
...
450 12345 450 3
451 23456 1 1
...