我现在有一个数据表,表名为:Test,结构及相关数据如下:
DM RS
0001 15
0002 29
0003 452
0004 1
0005 29
0006 1
0007 65
0008 32
0009 54
0010 2
0011 28
.... ....
.... ....
现在我想以RS=32为单位将该表重新组合为另外一个表,比如,将表中RS=29和RS=3的两行数据取出放到另外一个表中,假设表名为:TestA,结构同上表,只是增加一个组合列(ZHL),用以下形式来表示组合后的数据表中的数据
ZHL DM1 DM2
ZHL0001-n 上表中的DM1 上表中的DM2如果TEST表中的RS值大于了32,则先求余后再进行组合,优先组合只需要两个DM就可以组合为32的,然后再组合三个以上的,比如有32个DM的RS为1的,如果最后都没有31的值或其它值与它们组合,那么最后只有这32个组合了;但同时要尽量减少拆分组合,比如25,10,12,如果只剩下这三行数据没有组合了,才拆分组合为两个32(当然其中有一个没有32)。
DM RS
0001 15
0002 29
0003 452
0004 1
0005 29
0006 1
0007 65
0008 32
0009 54
0010 2
0011 28
.... ....
.... ....
现在我想以RS=32为单位将该表重新组合为另外一个表,比如,将表中RS=29和RS=3的两行数据取出放到另外一个表中,假设表名为:TestA,结构同上表,只是增加一个组合列(ZHL),用以下形式来表示组合后的数据表中的数据
ZHL DM1 DM2
ZHL0001-n 上表中的DM1 上表中的DM2如果TEST表中的RS值大于了32,则先求余后再进行组合,优先组合只需要两个DM就可以组合为32的,然后再组合三个以上的,比如有32个DM的RS为1的,如果最后都没有31的值或其它值与它们组合,那么最后只有这32个组合了;但同时要尽量减少拆分组合,比如25,10,12,如果只剩下这三行数据没有组合了,才拆分组合为两个32(当然其中有一个没有32)。
DECLARE @t TABLE(DM char(4), RS int)
INSERT @t SELECT '0001', 15
UNION ALL SELECT '0002', 29
UNION ALL SELECT '0003', 452
UNION ALL SELECT '0004', 1
UNION ALL SELECT '0005', 29
UNION ALL SELECT '0006', 1
UNION ALL SELECT '0007', 65
UNION ALL SELECT '0008', 32
UNION ALL SELECT '0009', 54
UNION ALL SELECT '0010', 2
UNION ALL SELECT '0011', 28-- 组合结果表
-- 大于32的取余
DECLARE @temp TABLE(DM char(4), RS int, RS1 int, flag bit)
INSERT @temp
SELECT DM, RS, RS % 32, flag = CASE WHEN rs%32 = 0 THEN 1 ELSE 0 END
FROM @tDECLARE @re TABLE(
RS int,
DM char(4),
RSS varchar(4000),
RSS1 varchar(4000),
DMS varchar(4000),
Level int,
flag bit)
DECLARE @l int
SELECT @l = 0
INSERT @re
SELECT
RS1,
A.DM,
RTRIM(A.RS),
RTRIM(A.RS1),
RTRIM(A.DM),
@l,
flag = A.flag
FROM @temp A
WHILE @@ROWCOUNT > 0
BEGIN
SET @l = @l + 1
INSERT @re
SELECT
A.RS + B.RS1,
B.DM,
RTRIM(A.RSS) + ', ' + RTRIM(B.RS),
RTRIM(A.RSS1) + ', ' + RTRIM(B.RS1),
RTRIM(A.DMS) + ', ' + RTRIM(B.DM),
@l,
flag = CASE WHEN A.RS + B.RS1 = 32 THEN 1 ELSE 0 END
FROM @re A, @temp B
WHERE A.Level = @l - 1
AND A.flag = 0 AND B.flag = 0
AND A.DM < B.DM
AND A.RS + B.RS1 <= 32
END-- 结果
SELECT
flag,
RS,
RSS = RSS1,
RSS,
DMS
FROM @re
WHERE flag = 1 OR Level = @l - 1