我现在有一个数据表,表名为: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)。

解决方案 »

  1.   

    -- 提供一种大致的处理方法-- 测试数据
    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
      

  2.   

    谢谢邹键老师了.拆分的那个,是在其它不拆分的组合完成了之后再拆分的.比如25,10,12,是指在其它没有组合完成的情况再拆分它们,比如对于25,如果还有8个DM的RS为1的,则先将25和这8个1的完成一个32的组合.