表TEST如下:
A    B     C      D       E      F      G            
2    5     2     991    128     1656    100  
2    6     21    990    127     1656    100       
2    7     35    861    95       574    100  
3    8     2     991    128     1656    100  
2    9     35    861    95       574    100  
1    5     21    990    127     1656    100  
1    3     35    861    95       574    100  
2    2     35    861    95       574    100  
3    1     21    990    127     1656    100  
3    3     35    861    95       574    100  
3    2     61    1325   74       864    100  
1    1     61    1325   74       864    100  
1    7     2     991    128     1656    100  
现在要求对C, D, E, F 这4个字段相同的值分组排序,然后根据A字段的值进行合并
也就是说假如我运行如下语句:
select * from (select C, D, E, F,  (Count(*)) As Num from TEST group by C, D, E, F)  t  where Num > 1 的话,会产生一个这样的结果
C      D       E     F        Num
2     991    128     1656     3  
21    990    127     1656     3
35    861    95       574     5
61    1325   74       864     2     
也就是会有4个组,然后接下来就是对这4个组根据A字段的值进行行合并,也就是说假如先看
C      D       E     F        Num
2     991    128     1656     3 
这一行的分组是
A    B     C      D       E      F      G            
2    5     2     991    128     1656    100 
3    8     2     991    128     1656    100
1    7     2     991    128     1656    100   
3条的情况,而合并的规则是对A字段为1的行取B,C,D,E的值,对为3的行取G的值,而F的值则是每行F字段的累加值
也就是(1656+1656+1656=4968)
最后把这一行新行产生以后更新A字段的值为5然后插入原表,
即是:A    B     C      D       E      F      G    
     5    7     2      991     128    4968   100 
一共会有4条新行产生,不知道我表达得清楚不,请大家指导
这样的SQL语句该如何来写?

解决方案 »

  1.   

    select  5 a,max(decode(a,1,b,0)) b,c,d,e,
                sum(f) over() f ,
                max(decode(a,3,g,0)) g
          from test
          group by c,d,f
          你的a最后为什么会等于5 描述的还是不清楚
    把你想要的结果,按你的测试数据贴出来
      

  2.   


    A    B    C      D      E      F      G            
    2    5    2    991    128    1656    100 
    3    8    2    991    128    1656    100 
    1    7    2    991    128    1656    100  
    5    7    2      991    128    4968  100 
    这是一条2    6    21    990    127    1656    100 
    1    5    21    990    127    1656    100 
    3    1    21    990    127    1656    100  
    5    5    21    990    127    4968    100
    这是一条2    7    35    861    95      574    100 
    2    9    35    861    95      574    100   
    1    3    35    861    95      574    100  
    2    2    35    861    95      574    100 
    3    3    35    861    95      574    100  
    5    3    35    861    95      2870   100 
    这是一条3    2    61    1325  74      864    100  
    1    1    61    1325  74      864    100  
    5    1    61    1325  74      1728   100
    这是一条所以一共会产生4条新行在原来的表里,至于a最后为什么会等于5,也就是把新行的A字段值写成5就可以了
       
         
      

  3.   

    其实你的g都是一样的值啊,
    还有,你a是否肯定每个会出现1和3,你f也就说只有同组的才加在一起的
    sql要改一下lect  5 a,max(decode(a,1,b,0)) b,c,d,e,
                sum(f) over(partition by c,d,e,f) f ,
                max(decode(a,3,g,0)) g
          from test
          group by c,d,e,f
      

  4.   

    WITH TEST AS
         (SELECT 2 a, 5 b, 2 c, 991 d, 128 e, 1656 f, 100 g
            FROM DUAL
          UNION ALL
          SELECT 2, 6, 21, 990, 127, 1656, 100
            FROM DUAL
          UNION ALL
          SELECT 2, 7, 35, 861, 95, 574, 100
            FROM DUAL
          UNION ALL
          SELECT 3, 8, 2, 991, 128, 1656, 100
            FROM DUAL
          UNION ALL
          SELECT 2, 9, 35, 861, 95, 574, 100
            FROM DUAL
          UNION ALL
          SELECT 1, 5, 21, 990, 127, 1656, 100
            FROM DUAL
          UNION ALL
          SELECT 1, 3, 35, 861, 95, 574, 100
            FROM DUAL
          UNION ALL
          SELECT 2, 2, 35, 861, 95, 574, 100
            FROM DUAL
          UNION ALL
          SELECT 3, 1, 21, 990, 127, 1656, 100
            FROM DUAL
          UNION ALL
          SELECT 3, 3, 35, 861, 95, 574, 100
            FROM DUAL
          UNION ALL
          SELECT 3, 2, 61, 1325, 74, 864, 100
            FROM DUAL
          UNION ALL
          SELECT 1, 1, 61, 1325, 74, 864, 100
            FROM DUAL
          UNION ALL
          SELECT 1, 7, 2, 991, 128, 1656, 100
            FROM DUAL)
    SELECT   5 a, MAX (DECODE (a, 1, b, 0)) b, c, d, e,
             SUM (f) OVER (PARTITION BY c, d, e, f) f, MAX (DECODE (a,
                                                                    3, g,
                                                                    0
                                                                   )) g
        FROM TEST
    GROUP BY c, d, e, f结果
    Row# A B C D E F G1 5 7 2 991 128 1656 100
    2 5 5 21 990 127 1656 100
    3 5 3 35 861 95 574 100
    4 5 1 61 1325 74 864 100
    看看是不是你婪的
      

  5.   

    上面还是有错误,
    应该
    SELECT   5 a, MAX (DECODE (a, 1, b, 0)) b, c, d, e,
             SUM (f) f, MAX (DECODE (a,
                                                                    3, g,
                                                                    0
                                                                   )) g
        FROM TEST
    GROUP BY c, d, e, f结果
    Row# A B C D E F G1 5 5 21 990 127 4968 100
    2 5 1 61 1325 74 1728 100
    3 5 7 2 991 128 4968 100
    4 5 3 35 861 95 2870 100