现在情况是这样的,我已通过sql语句查询出初步符合条件的表
需求:1:表中所有字段都是分组条件除了obligate2数字列,
  即:group_no + hs_code+ i_e_ +obligate3+ custom_code + curr 是一组
  2:在同一个group_no下且不同i_e_下才可以根据字段分组条件相减obligate2数字列
  3:在同一个group_no下且不同i_e_下相减规则是:
  同一个group_no 下i_e_=2 的 obligate2数字 减去 同一个group_no i_e_=1 的 obligate2 数字
  4:得出结果如果i_e_=2 的 obligate2数字大于i_e_=1 的 obligate2数字 那么结果就是
  别的列相同 而列i_e_等2 列obligate2就是他们的差,反之一样 取绝对值
  如
  group_no hs_code i_e_ obligate3 custom_code obligate2 curr
  7 abc 1 js2001 0129 200 116
  7 abc 2 js2001 0129 280 116
  根据规则结果应该是:
  group_no hs_code i_e_ obligate3 custom_code obligate2 curr
  7 abc 2 js2001 0129 80 116
  3:如果在同一个group_no下 根据字段分组条件找补到可以相减的那么就原封的现实该行 如图2:第三行数据
  4:图2 里第一二行都是根据字段分组条件相减obligate2数字列 得出的结果,也是我想要的。
初步查询结果如图1:
group_no hs_code i_e_ obligate3 custom_code obligate2 curr
  7 abc 1 js2001 0129 200 116
  7 abc 1 js2001 0129 200 142
  7 abc 2 js2001 0129 200 116
  7 abc 2 js2001 0129 280 142
  7 abc 1 js2002 0129 50 116
  8 abc 1 js2001 0129 200 116
  8 abc 1 js2001 0129 200 142
  8 abc 2 js2001 0129 200 116
  8 abc 2 js2001 0129 280 142
  8 abc 2 js2002 0129 50 142
想要查询结果如图2:
group_no hs_code i_e_ obligate3 custom_code obligate2 curr
  7 abc 2 js2001 0129 0 116
  7 abc 2 js2001 0129 80 142
  7 abc 1 js2002 0129 50 116
  8 abc 2 js2001 0129 0 116
  8 abc 2 js2001 0129 80 142
  8 abc 1 js2002 0129 50 116
希望我表达的清楚了,请问大侠这样SQL语句怎么写啊 高分项送

解决方案 »

  1.   


    高分项送............ 跪求SQL语句求差语句[问题点数:20分]
    汗一个先
      

  2.   

    group_no hs_code i_e_ obligate3 custom_code obligate2 curr
      7 abc 2 js2001 0129 0 116
      7 abc 2 js2001 0129 80 142
      7 abc 1 js2002 0129 50 116
      8 abc 2 js2001 0129 0 116
      8 abc 2 js2001 0129 80 142
      8 abc 1 js2002 0129 50 116
    这最后一行数据怎么得来的?
      

  3.   

    begin tran
    create table tt(group_no int, hs_code varchar(3), i_e_ int, obligate3 varchar(10), custom_code varchar(10), obligate2 int, curr int)
    go
    insert into tt
    select  7, 'abc', 1 ,'js2001' ,'0129' ,200, 116
    union all select  7 ,'abc', 1 ,'js2001', '0129', 200 ,142
    union all select  7 ,'abc', 2 ,'js2001', '0129', 200 ,116
    union all select  7 ,'abc', 2 ,'js2001', '0129', 280 ,142
    union all select  7 ,'abc', 1 ,'js2002', '0129', 50 ,116
    union all select  8 ,'abc', 1 ,'js2001', '0129', 200 ,116
    union all select  8 ,'abc', 1 ,'js2001', '0129', 200 ,142
    union all select  8 ,'abc', 2 ,'js2001', '0129', 200 ,116
    union all select  8 ,'abc', 2 ,'js2001', '0129', 280 ,142 
    union all select  8 ,'abc', 2 ,'js2002', '0129', 50 ,142
    go
    select group_no, hs_code, substring(max(right('0000000000' + cast(obligate2 as varchar(10)), 6) +  cast(i_e_ as varchar(10))), 7, 20), obligate3, custom_code, 
    case count(1) when 1 then max(obligate2) when 2 then abs(max(obligate2) - min(obligate2)) else -1 end as obligate2, curr
    from tt
    group by group_no, hs_code, obligate3, custom_code,curr 
    --having(count(i_e_) > 1)
    go
    rollback
      

  4.   

    结果是这样的
    group_no    hs_code                        obligate3  custom_code obligate2   curr        
    ----------- ------- ---------------------- ---------- ----------- ----------- ----------- 
    7           abc     2                      js2001     0129        0           116
    7           abc     2                      js2001     0129        80          142
    7           abc     1                      js2002     0129        50          116
    8           abc     2                      js2001     0129        0           116
    8           abc     2                      js2001     0129        80          142
    8           abc     2                      js2002     0129        50          142
      

  5.   

    TO: yyoinge 
    你的可能是对的,我就想要你这样语句 我先试下 可以的话给分 谢谢先