晕,我不能直接编辑帖子说
测试数据少一点吧,要求表A的10条数据分组到表B的不同m_value中去,允许一定误差,误差值可以设定
TableA 10条记录 总值为100                     TableB还是一样三条记录
id      value                                 m_id   m_value
 1        25                                   A        50
 2        15                                   B        30
 3        10                                   C        20
 4        3
 5        1
 6        5
 7        14
 8        16
 9        5
 10       6

解决方案 »

  1.   

    楼主想要的结果是什么?要求表A的10条数据分组到表B的不同m_value中去,允许一定误差,误差值可以设定不懂这句话的意思?
      

  2.   

    就是表A中不同记录的value相加=表B中m_value,
    比如现在A表中id=1、2、3的value相加就刚好等于B表中m_id位A的m_value
    这样A表剩下的id的value值相加再匹配到B表其他的m_id,一次类推
    万一匹配不到,那就允许误差,
    可以设定一个误差值,在这个误差值内也算匹配成功
    (即 |A表中id=1、2、3的value相加 - m_id位A的m_value|< 误差值 )
      

  3.   

                 
    --> 测试数据:[TableA]
    if object_id('[TableA]') is not null drop table [TableA]
    create table [TableA]([id] int,[value] int)
    insert [TableA]
    select 1,25 union all
    select 2,15 union all
    select 3,10 union all
    select 4,3 union all
    select 5,1 union all
    select 6,5 union all
    select 7,14 union all
    select 8,16 union all
    select 9,5 union all
    select 10,6select flag,sum(value)from (
    select *,flag=(id-1)/(select count(1)/3 from [TableA]) from [TableA]
    )t
    group by flag/*
    flag        
    ----------- -----------
    0           50
    1           9
    2           35
    3           6(4 行受影响)*/
    drop table [TableA]
      

  4.   


    非常感谢一直在帮忙解决问题
    但结果好像有点问题,我要的结果应该类似如下
    m_id=A的TableA的id(1、2、3)
    m_id=B的TableA的id(7、8)
    m_id=C的TableA的id(4、5、6、9、10)
    或者
    m_id=A的TableA的id(1、2、6、9)
    m_id=B的TableA的id(7、8)
    m_id=C的TableA的id(3、4、5、10)
    再或者……
    应该有很多种组合,但只要有一种全部匹配上,就可以
      

  5.   

               
    --> 测试数据:[TableA]
    if object_id('[TableA]') is not null drop table [TableA]
    create table [TableA]([id] int,[value] int)
    insert [TableA]
    select 1,25 union all
    select 2,15 union all
    select 3,10 union all
    select 4,3 union all
    select 5,1 union all
    select 6,5 union all
    select 7,14 union all
    select 8,16 union all
    select 9,5 union all
    select 10,7 select m_id=case when flag=0 then 'A' when flag=1 then 'B' when flag=2 then 'C' end,m_value=sum(value)from (
    select *,flag=(Row_Number() over(order by newid())-1)%(select count(1)/3 from [TableA]) from [TableA]
    )t
    group by flag/*
    m_id m_value
    ---- -----------
    A    33
    B    28
    C    40(3 行受影响)*/drop table [TableA]
      

  6.   

    应该不是一句的sql语句能完成,因为我的分组规则有很多,所以应该是一个过程
    我想知道解决的思路