比如表如下
id1  id2  money
1    1    1
2    2    1
3    2    1
4    2    1
5    2    1id1是主键,如果id1=id2说明是新建的数据,如果id1!=id2 则是根据id2所代表的数据复制过来的。(比如3是根据2复制的,4也是根据2复制的,5也是)现在要求 如果是复制数据的话 统计money的时候去统计改数据所复制的那个案件中的money,如果复制源数据已经删了(就是id1=2的那条数据没有了),并且根据这个复制源复制了多条数据,则在这个复制源所复制出的案件中 取id1最大的那个money. 望指教

解决方案 »

  1.   

    select * from TB A where id1=(select max(id1) from TB B where A.ID2=B.ID2)
      

  2.   

    select t.* from tb t where id1 = (select max(id1) from tb where id2 = t.id2)
    select t.* from tb t where not exists (select 1 from tb where id2 = t.id2 where id1 > t.id1)如果上述不对,请:
    建议你提供详细的资料:
    例如表的结构,表之间的关系,测试数据,相关算法及需要的结果。
    这样有助于我们理解你的意思,更主要的是能尽快让你获得答案或解决问题的方法。
      

  3.   

    use Tempdb
    go
    --> --> 
     
    if not object_id(N'Tempdb..#T') is null
    drop table #T
    Go
    Create table #T([id1] int,[id2] int,[money] int)
    Insert #T
    select 1,1,1 union all
    select 2,2,1 union all
    select 3,2,1 union all
    select 4,2,1 union all
    select 5,2,1
    Go
    SELECT id1,id2,[money]
    FROM 
    (Select 
    *,ROW_NUMBER()OVER(PARTITION BY id2 ORDER BY CASE WHEN id1=id2 THEN 1 ELSE 0 END asc,[money] desc,id1)  AS row
    from #T AS a 
    )t
    WHERE row=1/*
    id1 id2 money
    1 1 1
    3 2 1*/
      

  4.   

    刪除時這樣用use Tempdb
    go
    --> --> 
     
    if not object_id(N'Tempdb..#T') is null
    drop table #T
    Go
    Create table #T([id1] int,[id2] int,[money] int)
    Insert #T
    select 1,1,1 union all
    select 2,2,1 union all
    select 3,2,1 union all
    select 4,2,1 union all
    select 5,2,1
    Go
    DELETE a FROM #T AS  a WHERE id1=id2 AND EXISTS(SELECT 1 FROM #T WHERE id2=a.id2 AND id1<>a.id1)SELECT * FROM #T
    /*
    id1 id2 money
    1 1 1
    3 2 1
    4 2 1
    5 2 1
    */
      

  5.   


    select
        T.id1,
        case when A.money is not null then A.money
                                 else then B.money
        end
    from
    table T 
    left join(select max(money) as money,id1 from table where id1=id2 group by id1)as A on t.id1=A.id1
    left join(select max(money) as money,id1 from table where id1!=id2 group by id1)as B on t.id1=B.id1
     
      

  6.   

    说的不够明白,再解释一下 如下表所示 管理号是主键
    管理号  关联管理号 money  月份
    1111    1111    10000    1
    1112    1111    5000     2
    1113    1111    4000     3
    1114    1111    3000     4
    1115    1110    1000     6
    1116    1110    2000     5要统计每个月的money分三种情况!
    1.如果 管理号 = 关联管理号 就取该数据的money进行统计
    2.如果 管理号 != 关联管理号 并且 关联管理号 所对应的 管理号 存在 就取所关联的管理号的money进行  统计,(如果多个数据关联相同一个管理号 统计的时候只统计一个关联的管理号,如1111~1114,统计的时候       就只统计1111的money)
    3.如果 管理号 !=关联管理号 并且 所关联的管理号数据不存在 如1115~1116 所对应的1110数据不存在
      就取管理号最大的去统计,也就是在1115~1116中只统计1116的money.但显示的时候却是按照月份最大的 显示的 也就是说1116这条数据的money 要显示在6月份里按照上表所示,查询效果如下
    1月份  2月份  3月份  4月份  5月份  6月份
    10000  0     0      0     0      2000     很棘手啊
      

  7.   

    use Tempdb
    go
    --> --> 
     
    if not object_id(N'Tempdb..#T') is null
    drop table #T
    Go
    Create table #T([管理号] int,[关联管理号] int,[money] int,[月份] int)
    Insert #T
    select 1111,1111,10000,1 union all
    select 1112,1111,5000,2 union all
    select 1113,1111,4000,3 union all
    select 1114,1111,3000,4 union all
    select 1115,1110,1000,6 union all
    select 1116,1110,2000,5
    Go
    DECLARE @s NVARCHAR(4000)Select @s=ISNULL(@s+',','select ')+QUOTENAME(RTRIM([月份])+N'月份')+'=max( case when [月份]='+RTRIM([月份])+' then [money] else 0 end)' 
    from #T GROUP BY [月份]
    --PRINT @s+N'from (SELECT a.[管理号],a.[关联管理号],a.[月份],case when b.[月份] is null then 0 else a.[money] end AS [money] FROM #T  AS a left JOIN (SELECT [关联管理号],MIN([月份])[月份] FROM #T  GROUP BY [关联管理号]) AS b ON a.[关联管理号]=b.[关联管理号] AND a.[月份]=b.[月份]) as t'
    EXEC(@s+N'from (SELECT a.[管理号],a.[关联管理号],a.[月份],case when b.[月份] is null then 0 else a.[money] end AS [money] FROM #T  AS a left JOIN (SELECT [关联管理号],MIN([月份])[月份] FROM #T  GROUP BY [关联管理号]) AS b ON a.[关联管理号]=b.[关联管理号] AND a.[月份]=b.[月份]) as t')--生成語句
    /*
    select [1月份]=max( case when [月份]=1 then [money] else 0 end),[2月份]=max( case when [月份]=2 then [money] else 0 end),[3月份]=max( case when [月份]=3 then [money] else 0 end),[4月份]=max( case when [月份]=4 then [money] else 0 end),[5月份]=max( case when [月份]=5 then [money] else 0 end),[6月份]=max( case when [月份]=6 then [money] else 0 end)from (SELECT a.[管理号],a.[关联管理号],a.[月份],case when b.[月份] is null then 0 else a.[money] end AS [money] FROM #T  AS a left JOIN (SELECT [关联管理号],MIN([月份])[月份] FROM #T  GROUP BY [关联管理号]) AS b ON a.[关联管理号]=b.[关联管理号] AND a.[月份]=b.[月份]) as t
    */--結果顯示 
    /*
    1月份 2月份 3月份 4月份 5月份 6月份
    10000 0 0 0 2000 0
    */
      

  8.   

    大哥 你忽略了一点 就是1116所统计money要放到6月份里显示。1116 和1115是根据相同的管理号复制过来的,所以统计money的时候要统计管理号较大的那个 而显示的时候却要显示在月份较大里。我现在万事俱备,就差这个月份显示的问题了 
      

  9.   


    还有不写存储过程行吗?现在的开发结构用存储过程会很麻烦,我都是用 select * into temptable from...
      

  10.   


    改改這樣處理use Tempdb
    go
    --> --> 
     
    if not object_id(N'Tempdb..#T') is null
    drop table #T
    Go
    Create table #T([管理号] int,[关联管理号] int,[money] int,[月份] int)
    Insert #T
    select 1111,1111,10000,1 union all
    select 1112,1111,5000,2 union all
    select 1113,1111,4000,3 union all
    select 1114,1111,3000,4 union all
    select 1115,1110,1000,6 union all
    select 1116,1110,2000,5
    Go
    DECLARE @s NVARCHAR(4000)Select @s=ISNULL(@s+',','select ')+QUOTENAME(RTRIM([月份])+N'月份')+'=max( case when [月份]='+RTRIM([月份])+' then [money] else 0 end)' 
    from #T GROUP BY [月份]--顯示生成語句
    /*
    PRINT @s+N'
    from 
    (SELECT a.[管理号],a.[关联管理号],CASE WHEN (b.con>1 AND b.IsManager=0 AND a.[管理号]=b.[管理号]) THEN b.[MaxMonth] ELSE a.[月份] END AS [月份],
    case when b.con>1 AND ((b.IsManager=1 AND a.[money]=b.[money]) OR (b.con>1 AND b.IsManager=0 AND a.[管理号]=b.[管理号]) OR b.con=1 ) then a.[money]  ELSE 0  end AS [money] 
    FROM #T  AS a 
    INNER JOIN (SELECT [关联管理号],MAX([管理号]) AS [管理号],MIN([月份])[MinMonth],MAX([月份])[MaxMonth],MAX([money]) AS [money],max(CASE WHEN [关联管理号]=[管理号] THEN 1 ELSE 0 END) AS IsManager,COUNT(*) AS con FROM #T  GROUP BY [关联管理号]) AS b 
    ON a.[关联管理号]=b.[关联管理号])t
    '
    */
    EXEC(@s+N'
    from 
    (SELECT a.[管理号],a.[关联管理号],CASE WHEN (b.con>1 AND b.IsManager=0 AND a.[管理号]=b.[管理号]) THEN b.[MaxMonth] ELSE a.[月份] END AS [月份],
    case when b.con>1 AND ((b.IsManager=1 AND a.[money]=b.[money]) OR (b.con>1 AND b.IsManager=0 AND a.[管理号]=b.[管理号]) OR b.con=1 ) then a.[money]  ELSE 0  end AS [money] 
    FROM #T  AS a 
    INNER JOIN (SELECT [关联管理号],MAX([管理号]) AS [管理号],MIN([月份])[MinMonth],MAX([月份])[MaxMonth],MAX([money]) AS [money],max(CASE WHEN [关联管理号]=[管理号] THEN 1 ELSE 0 END) AS IsManager,COUNT(*) AS con FROM #T  GROUP BY [关联管理号]) AS b 
    ON a.[关联管理号]=b.[关联管理号])t
    ')--生成語句
    /*
    select [1月份]=max( case when [月份]=1 then [money] else 0 end),[2月份]=max( case when [月份]=2 then [money] else 0 end),[3月份]=max( case when [月份]=3 then [money] else 0 end),[4月份]=max( case when [月份]=4 then [money] else 0 end),[5月份]=max( case when [月份]=5 then [money] else 0 end),[6月份]=max( case when [月份]=6 then [money] else 0 end)
    from 
    (SELECT a.[管理号],a.[关联管理号],CASE WHEN (b.con>1 AND b.IsManager=0 AND a.[管理号]=b.[管理号]) THEN b.[MaxMonth] ELSE a.[月份] END AS [月份],
    case when b.con>1 AND ((b.IsManager=1 AND a.[money]=b.[money]) OR (b.con>1 AND b.IsManager=0 AND a.[管理号]=b.[管理号]) OR b.con=1 ) then a.[money]  ELSE 0  end AS [money] 
    FROM #T  AS a 
    INNER JOIN (SELECT [关联管理号],MAX([管理号]) AS [管理号],MIN([月份])[MinMonth],MAX([月份])[MaxMonth],MAX([money]) AS [money],max(CASE WHEN [关联管理号]=[管理号] THEN 1 ELSE 0 END) AS IsManager,COUNT(*) AS con FROM #T  GROUP BY [关联管理号]) AS b 
    ON a.[关联管理号]=b.[关联管理号])t
    */
    --結果顯示 
    /*
    1月份 2月份 3月份 4月份 5月份 6月份
    10000 0 0 0 0 2000
    */
      

  11.   

    2.如果 管理号 != 关联管理号 并且 关联管理号 所对应的 管理号 存在 就取所关联的管理号的money进行 统计這里應該是最大money麼?用13樓方法測測
      

  12.   


    固定月份直接寫就行了
    select [1月份]=max( case when [月份]=1 then [money] else 0 end),[2月份]=max( case when [月份]=2 then [money] else 0 end),[3月份]=max( case when [月份]=3 then [money] else 0 end),[4月份]=max( case when [月份]=4 then [money] else 0 end),[5月份]=max( case when [月份]=5 then [money] else 0 end),[6月份]=max( case when [月份]=6 then [money] else 0 end)
    from 
    (SELECT a.[管理号],a.[关联管理号],CASE WHEN (b.con>1 AND b.IsManager=0 AND a.[管理号]=b.[管理号]) THEN b.[MaxMonth] ELSE a.[月份] END AS [月份],
        case when b.con>1 AND ((b.IsManager=1 AND a.[money]=b.[money]) OR (b.con>1 AND b.IsManager=0 AND a.[管理号]=b.[管理号]) OR b.con=1 ) then a.[money]  ELSE 0  end AS [money] 
    FROM #T  AS a 
    INNER JOIN (SELECT [关联管理号],MAX([管理号]) AS [管理号],MAX([月份])[MaxMonth],MAX([money]) AS [money],max(CASE WHEN [关联管理号]=[管理号] THEN 1 ELSE 0 END) AS IsManager,COUNT(*) AS con FROM #T  GROUP BY [关联管理号]) AS b 
    ON a.[关联管理号]=b.[关联管理号])t/*
    1月份 2月份 3月份 4月份 5月份 6月份
    10000 0 0 0 0 2000
    */