表如下:BH XS1 XS2 XS3 XS4 XS5 XS6 XS7 XS8 XS9 XS10
A 2 4 1 1 2 4 1 4 1 2
B 1 2 3 3 1 2 4 6 2 2
第一列    求和为22 除以2为11,
字段数值按顺序相加,最接近11的字段XS1+XS2+XS3+XS4+XS5=10 
那么另一表的结果为XS5第二列    求和为26 除以2为13,
字段数值按顺序相加,最接近13的字段为XS1+XS2+XS3+XS4+XS5+XS6=12 
那么另一表的结果为XS6用什么办法能求出BH=A的值为5(XS5),BH=B的值为6(XS6)

解决方案 »

  1.   


    create table tb
    (
    BH varchar(10),
    XS1 int,
    XS2 int,
    XS3 int,
    XS4 int,
    XS5 int,
    XS6 int,
    XS7 int,
    XS8 int,
    XS9 int,
    XS10 int
    )
    insert into tb
    select 'A',2,4,1,1,2,4,1,4,1,2 union all
    select 'B',1,2,3,3,1,2,4,6,2,2
    gowith cte as
    (
    select bh,xs1 as fh,1 as rn from tb
    union all
    select bh,xs2,2 from tb
    union all
    select bh,xs3,3 from tb
    union all
    select bh,xs4,4 from tb
    union all
    select bh,xs5,5 from tb
    union all
    select bh,xs6,6 from tb
    union all
    select bh,xs7,7 from tb
    union all
    select bh,xs8,8 from tb
    union all
    select bh,xs9,9 from tb
    union all
    select bh,xs10,10 from tb
    )select e.bh,max(e.rn)rn,'xs'+ ltrim(max(e.rn)) as xs
    from cte e left join (select bh,sum(fh)/2 as dh from cte group by bh)d on e.bh = d.bh
    where (select sum(fh) from cte where bh = e.bh and rn <= e.rn) < d.dh
    group by e.bh,d.dhdrop table tb/*
    bh         rn          xs
    ---------- ----------- --------------
    A          5           xs5
    B          6           xs6(2 行受影响)
      

  2.   

    CREATE TABLE #TEMP
    (
        BH VARCHAR(10),
        XS1 INT,
        XS2 INT,
        XS3 INT,
        XS4 INT,
        XS5 INT,
        XS6 INT,
        XS7 INT,
        XS8 INT,
        XS9 INT,
        XS10 INT
    )
    INSERT INTO #TEMP
    SELECT 'A',2,4,1,1,2,4,1,4,1,2 UNION ALL
    SELECT 'B',1,2,3,3,1,2,4,6,2,2--SQL
    ;WITH cte_t1 as
    (
    SELECT * FROM #TEMP
    UNPIVOT
    (cnt FOR XS IN ([XS1], [XS2], [XS3], [XS4],[XS5],[XS6],[XS7],[XS8],[XS9],[XS10])) b
    ),
    cte_t2 as
    (
    SELECT BH, tcnt = SUM(cnt)
    FROM cte_t1
    GROUP BY BH
    ),
    cte_t3 as
    (
    SELECT rowno = ROW_NUMBER() OVER(ORDER BY GETDATE()),A.*, B.tcnt FROM cte_t1 A, cte_t2 B WHERE A.BH = B.BH
    ),
    cte_t4 as
    (
    SELECT
    *,
    DIFF = tcnt/2 - (SELECT SUM(cnt) FROM cte_t3 WHERE BH = M.BH AND rowno <= M.rowno)
    FROM cte_t3 M
    )
    SELECT A.BH, B.XS FROM
    (SELECT DISTINCT BH FROM cte_t4) A
    CROSS APPLY
    (SELECT TOP(1) * FROM cte_t4 WHERE BH = A.BH ORDER BY ABS(DIFF)) B
    --result
    /*
    BH XS
    A XS5
    B XS6
    */