问题说明
在某工厂的生产过程中,有个螺栓拧紧的操作,针对不同的工序分不同的步数。如,第1步1个,第二步3个,第三步5个。这样在记录的时候,就会记录出以下表(名为PBT),所有字段均为int型,结构和数据如下所示:
PBT_ID | PBT_ProductID | PBT_OPStationID | PBT_BoltID | PBT_StepID | PBT_BoltCount |
---|---|---|---|---|---|
4 | 1 | 2 | 1 | 1 | 1 |
5 | 1 | 2 | 3 | 2 | 1 |
6 | 1 | 2 | 4 | 3 | 1 |
7 | 1 | 3 | 5 | 1 | 1 |
8 | 1 | 3 | 7 | 2 | 2 |
9 | 1 | 4 | 10 | 1 | 4 |
10 | 1 | 5 | 11 | 1 | 19 |
11 | 1 | 6 | 11 | 1 | 11 |
12 | 1 | 7 | 16 | 1 | 7 |
13 | 1 | 8 | 18 | 1 | 2 |
14 | 1 | 9 | 29 | 1 | 2 |
15 | 1 | 10 | 34 | 1 | 10 |
16 | 1 | 11 | 35 | 1 | 10 |
17 | 1 | 13 | 41 | 2 | 1 |
18 | 1 | 13 | 42 | 3 | 2 |
26 | 1 | 13 | 112 | 1 | 2 |
19 | 1 | 14 | 43 | 1 | 20 |
20 | 1 | 15 | 44 | 1 | 11 |
21 | 1 | 16 | 46 | 1 | 6 |
22 | 1 | 17 | 47 | 1 | 1 |
23 | 1 | 17 | 48 | 2 | 5 |
24 | 1 | 17 | 49 | 3 | 4 |
25 | 1 | 17 | 50 | 4 | 1 |
27 | 1 | 18 | 114 | 1 | 1 |
28 | 1 | 19 | 119 | 1 | 3 |
29 | 1 | 19 | 120 | 2 | 2 |
30 | 1 | 19 | 121 | 3 | 1 |
31 | 1 | 20 | 128 | 3 | 8 |
32 | 1 | 20 | 129 | 1 | 1 |
33 | 1 | 20 | 130 | 2 | 1 |
34 | 1 | 21 | 132 | 1 | 1 |
35 | 1 | 21 | 133 | 2 | 2 |
36 | 1 | 21 | 134 | 3 | 1 |
235 | 1 | 22 | 136 | 1 | 1 |
236 | 1 | 23 | 138 | 1 | 3 |
237 | 1 | 23 | 143 | 2 | 1 |
238 | 1 | 24 | 145 | 1 | 22 |
由于现在要对拧紧的螺栓加上起始编号,如前面三步工序的螺栓中, 第1步的起始编号是0,第2步的起始编号是为第1步的总数,即1,第3步的起始编号是第1步+第2步的总数,即4,以此类推。在上表中,即判断相关PBT_OPStationID的记录,在不同的PBT_StepID下的 BoltCount的顺序。比如,当PBT_OPStationID为2时,有以下三条数据
PBT_ID | PBT_ProductID | PBT_OPStationID | PBT_BoltID | PBT_StepID | PBT_BoltCount |
---|---|---|---|---|---|
4 | 1 | 2 | 1 | 1 | 1 |
5 | 1 | 2 | 3 | 2 | 1 |
6 | 1 | 2 | 4 | 3 | 1 |
对应的PBT_StepID分别为1,2,3。
- 当PBT_StepID为1时,起始编号为0
- 当PBT_StepID为2时,其编号为BoltCount[PBT_StepID=1时] = 1
- 当PBT_StepID为3时,其编号为 BoltCount[PBT_StepID=1时] + BoltCount[PBT_StepID=2时] = 1 + 1 = 2
由于每次都要计算,比较麻烦同时也降低服务器运行效率,所以现在希望追加一个字体直接保存起始编号信息。
解决
为了起始编号,我们追加了一个PBT_BoltTotalCount字段。在计算时,我们只需要计算当相同PBT_OPStationID下,对于当前PBT_StepID,所有小于它的记录的BoltCount求和。解决的SQL语句如下:
DECLARE @OPID INT, @STEPID INT
SET @OPID = 1
SET @STEPID = 1
WHILE @OPID <= 24
BEGIN
SET @STEPID = 1
WHILE @STEPID <= 4
BEGIN
Update [cvinet_test].[dbo].[ProductBoltTightening]
Set PBT_BoltTotalCount = isnull((select sum(PBT_BoltCount) from ProductBoltTightening WHERE PBT_OPStationID = @OPID AND ProductBoltTightening.PBT_StepID < @STEPID), 0)
Where PBT_OPStationID = @OPID AND PBT_StepID = @STEPID
SET @STEPID = @STEPID + 1
END
SET @OPID = @OPID+1
END
在以上的SQL中,使用了双层循环,分别对不同的PBT_OPStationID和PBT_StepID进行计算。
结果
执行后,结果如下所示:
PBT_ID | PBT_ProductID | PBT_OPStationID | PBT_BoltID | PBT_StepID | PBT_BoltCount | PBT_BoltTotalCount |
---|---|---|---|---|---|---|
4 | 1 | 2 | 1 | 1 | 1 | 0 |
5 | 1 | 2 | 3 | 2 | 1 | 1 |
6 | 1 | 2 | 4 | 3 | 1 | 2 |
7 | 1 | 3 | 5 | 1 | 1 | 0 |
8 | 1 | 3 | 7 | 2 | 2 | 1 |
9 | 1 | 4 | 10 | 1 | 4 | 0 |
10 | 1 | 5 | 11 | 1 | 19 | 0 |
11 | 1 | 6 | 11 | 1 | 11 | 0 |
12 | 1 | 7 | 16 | 1 | 7 | 0 |
13 | 1 | 8 | 18 | 1 | 2 | 0 |
14 | 1 | 9 | 29 | 1 | 2 | 0 |
15 | 1 | 10 | 34 | 1 | 10 | 0 |
16 | 1 | 11 | 35 | 1 | 10 | 0 |
17 | 1 | 13 | 41 | 2 | 1 | 2 |
18 | 1 | 13 | 42 | 3 | 2 | 3 |
26 | 1 | 13 | 112 | 1 | 2 | 0 |
19 | 1 | 14 | 43 | 1 | 20 | 0 |
20 | 1 | 15 | 44 | 1 | 11 | 0 |
21 | 1 | 16 | 46 | 1 | 6 | 0 |
22 | 1 | 17 | 47 | 1 | 1 | 0 |
23 | 1 | 17 | 48 | 2 | 5 | 1 |
24 | 1 | 17 | 49 | 3 | 4 | 6 |
25 | 1 | 17 | 50 | 4 | 1 | 10 |
27 | 1 | 18 | 114 | 1 | 1 | 0 |
28 | 1 | 19 | 119 | 1 | 3 | 0 |
29 | 1 | 19 | 120 | 2 | 2 | 3 |
30 | 1 | 19 | 121 | 3 | 1 | 5 |
31 | 1 | 20 | 128 | 3 | 8 | 2 |
32 | 1 | 20 | 129 | 1 | 1 | 0 |
33 | 1 | 20 | 130 | 2 | 1 | 1 |
34 | 1 | 21 | 132 | 1 | 1 | 0 |
35 | 1 | 21 | 133 | 2 | 2 | 1 |
36 | 1 | 21 | 134 | 3 | 1 | 3 |
235 | 1 | 22 | 136 | 1 | 1 | 0 |
236 | 1 | 23 | 138 | 1 | 3 | 0 |
237 | 1 | 23 | 143 | 2 | 1 | 3 |
238 | 1 | 24 | 145 | 1 | 22 | 0 |