我现在有这样一张表A,表结构如下:
DWDM,WPDM, SL
001  P13   10
001  TNT   5
002  P13   20
003  TYP   100
002  P51   12
....
现在我要通过按单位(DWDM),物品(WPDM)分组对数量(SL)进行求和,
要产生如下结构的数据集:
ID  DWDM WPDM SL
1   001  P13  10
1   001  TNT  5
2   002  P13  20
2   002  P51  12
3   003  TYP  100 
即DWDM相同,则ID相同,关键点是这个,而且数据量巨大,要考虑效率问题!谢谢高手们赐教!

解决方案 »

  1.   

    在表A建立个to_number含数索引,select to_number(DWDM),a.* from 表A a
      

  2.   


    select to_number(dwdm) id,DWDM,WPDM,SL from tableA order by id;
      

  3.   


    select to_number(dwdm) id,DWDM,WPDM,sum(SL) from tableA order by id group by DWDM,WPDM;
      

  4.   

    --order by 和 group by 不用连用:select to_char(t.a) id, t.a dwdm, t.b wpdm, t.c sl
      from (select dwdm a, wpdm b, sum(sl) c from tableA group by dwdm, wpdm) t
     order by id;
      

  5.   

    谢谢各位解答~~我在实际运用的过程中比现在要复杂很多~用DWDM做ID是不合适的~~
    请问还有别的方法吗?
      

  6.   


    select id,DWDM,WPDM,sum(SL) from
    (select DWDM,WPDM,SL,row_number() over(partion by DWDM order by DWDM) id from tableA) group by id,DWDM,WPDM
      

  7.   

    使用自增序列sequence,搜一下,到处都是。
      

  8.   

    --给个简单的参考例子: create table t(pk number primary key,...); 
    create sequence t_seq; 
    create trigger t_trigger before insert on t for each row 
    begin 
      select t_seq.nextval into :new.pk from dual; 
    end; 
      

  9.   

    用sequence...可是我的ID是要按DWDM走的~~相同的DWDM相同的ID~~~
      

  10.   

    1.先建一张表如table_id一次性产生10000个号码;
    2.每次insert tableA表时,从table_id中取最小的一个号码作为DWDM:  select min(id0) from table_id;
    3.修改tableA表中的id,使之与DWDM相同。
      

  11.   

    用做链接不过比较麻烦SQL> select * from a;
     
    DWDM       WPDM       SL
    ---------- ---------- ----------
    001        p13        10
    001        tnt        5
    002        p13        20
    003        typ        100
    002        p51        12
     
    SQL> 
    SQL> select rn, a.dwdm, wpdm, sl
      2    from a, (select dwdm, rownum rn from (select distinct dwdm from a order by dwdm)) b
      3   where a.dwdm = b.dwdm
      4   order by rn;
     
            RN DWDM       WPDM       SL
    ---------- ---------- ---------- ----------
             1 001        tnt        5
             1 001        p13        10
             2 002        p51        12
             2 002        p13        20
             3 003        typ        100
      

  12.   

    下面的如果还慢,考虑索引问题scott@ORA1> select * from a;DWDM            WPDM                    SL
    --------------- --------------- ----------
    001             P13                     10
    001             TNT                      5
    002             P13                     20
    003             TYP                    100
    002             P51                     12scott@ORA1> SELECT dense_rank() over(order by dwdm) num
      2     ,dwdm
      3     ,wpdm
      4     ,sum_sl
      5    FROM (
      6   SELECT DWDM, WPDM, SUM(SL) sum_sl
      7     FROM A
      8    GROUP BY dwdm, wpdm
      9      ) x;       NUM DWDM            WPDM                SUM_SL
    ---------- --------------- --------------- ----------
             1 001             P13                     10
             1 001             TNT                      5
             2 002             P13                     20
             2 002             P51                     12
             3 003             TYP                    100
      

  13.   

    问题解决!谢谢大家!dense_rank() over(order by dwdm)
      

  14.   

    问题解决!谢谢大家!dense_rank() over(order by dwdm)
      

  15.   

    我觉得前台实现是否更节省资源,既然按照dwdm排序,干吗不直接在单位表中增加一个id字段呢