开发环境:ado+access 
数据结构:(原始表)
代理商     产品     数量
代理商1    产品1     2
代理商2    产品1     4
代理商3    产品1     2
代理商1    产品2     4
代理商2    产品2     0
代理商3    产品3     3
。。
记录大概有3000条,希望转化为下面的结构:(目标表)
代理商    产品1  产品2  产品3
代理商1    2       4       3
代理商2    4       0       8
代理商3    2       3       1
。。寻求运行速度最快的解决方法。有一点说明:access不支持union语法。

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/1015/1015421.xml?temp=.2746546
    也许会有帮助。
      

  2.   

    access上单纯用SQL语句搞不定!
    可编程实现!
      

  3.   

    Access对SQL的执行,有时会出现不稳定的异常
    我想,你可以用Delphi做一个小程序,先将上面的表里的数据检索出来,
    然后每条判断,再对下面的数据表进行操作,这样虽然慢一些,但很安全,
    如果你的数据量不超过20万条,那么与你用SQL的差别,应该用户还是能够忍受的!
      

  4.   

    select 代理商,sum(iif(产品='产品1',数量,0)) as 产品1,
      sum(iif(产品='产品2',数量,0)) as 产品2,
      sum(iif(产品='产品3',数量,0)) as 产品3,
      ...
      sum(iif(产品='产品N',数量,0)) as 产品N
    from 原始表
    group by 代理商这是个示意性的,如果产品个数一定而且事先知道,可以直接用。
    如果不是,可以在客户端先“select distinct 产品 from 原始表”,循环拼出这个语句。
      

  5.   

    同意haiwer 
    这是sql 里的标准实现交叉表的方法,访问逻辑IO的次数算是较少的,inside sql 的一系列书中作者都有详细的介绍和比较!
      

  6.   

    Delphi提供了DecisionCube组件就是解决这种问题的,他不仅支持二维统计,还支持N维统计,建议使用,至于文档方面去网上搜索一下吧,英文网站有相关的阿文档
      

  7.   

    SQL> Create table tian_a(a varchar2(10),b varchar2(10),c number(2));[注】:a 代理商,b 产品 C 数量
    SQL> insert into tian_a values('代1','产1',2);
    已创建 1 行。
    SQL> insert into tian_a values('代2','产1',4);
    已创建 1 行。
    SQL> insert into tian_a values('代3','产1',2);
    已创建 1 行。
    SQL> insert into tian_a values('代1','产2',4);
    已创建 1 行。
    SQL> insert into tian_a values('代2','产2',0);
    已创建 1 行。
    SQL> insert into tian_a values('代3','产3',3);
    已创建 1 行。
    SQL> commit;
    提交完成。
    SQL> select a,sum(decode(b,'产1',c,0)) p1,
      2           sum(decode(b,'产2',c,0)) p2,
      3           sum(decode(b,'产3',c,0)) p3
      4  from tian_a group by a;  A               P1        P2        P3
    -------- --------- --------- ---------
    代1              2         4         0
    代2              4         0         0
    代3              2         0         3
    SQL> 这是ORACLE实现的方法.
      

  8.   

    Haiwer(海阔天空):你的方法很不错,可惜access不支持iif语法。
    :(
      

  9.   

    to: lzl0901() 
    access怎么不支持iif语法????!!!我可是在access2000下测试通过了才贴上去的。不想给分可以,但不要误导大家!
      

  10.   

    发现楼主非常奇怪,access有怎么不支持union语法了!
      

  11.   

    select distinct 代理商,(select sum(数量) from tablename where 代理商=a.代理商 and 产品=产品1) as 产品1,select sum(数量) from tablename where 代理商=a.代理商 and 产品=产品2) as 产品2 from tablename a
    写SQL于句太复杂,不过相对于别的方法却又但存许多
      

  12.   

    不知你要表达的结果到底是什么?若仅仅是结构变换(好像无意义).
      基本同意 iceshape(iceshape) 的用法:
      select distinct 代理商,(select sum(数量) from tablename where 代理商=a.代理商 and 产品=产品1) as 产品1,select sum(数量) from tablename where 代理商=a.代理商 and 产品=产品2) as 产品2 from tablename a
      但应该去掉前面的distinct,这将导致记录唯一。
      

  13.   

    嗯,是我错了,可以用iif语法,我是先前被同事影响的,像大家道歉。
      

  14.   

    Haiwer(海阔天空):
      你的方法不错,测试可以通过,不过我还有一个问题,就是计算行合计和列合计,请多指点。谢谢。
      

  15.   

    select 代理商,sum(iif(产品='产品1',数量,0)) as 产品1,
      sum(iif(产品='产品2',数量,0)) as 产品2,
      sum(iif(产品='产品3',数量,0)) as 产品3,
      ...
      sum(iif(产品='产品N',数量,0)) as 产品N,
      sum(数量) as 行合计
    from 原始表
    group by 代理商
    union all
    select '列合计' as 代理商,sum(iif(产品='产品1',数量,0)) as 产品1,
      sum(iif(产品='产品2',数量,0)) as 产品2,
      sum(iif(产品='产品3',数量,0)) as 产品3,
      ...
      sum(iif(产品='产品N',数量,0)) as 产品N,
      sum(数量) as 行合计
    from 原始表
      

  16.   

    烦劳,还有一个问题:如果原始表是这样的:
    rq                product            sl
    2000-1-1          prod1               1
    2000-1-2          prod1               1
    2000-1-1          prod2               2
    2000-1-10         prod2               2
    按周来算,就是说转化为:(假设1-1是周1)
    rq                prod1      prod2
    2000-1-1           2           2
    2000-1-8           0           2这样的话该怎样写?再有,原始表中的rq,prod换一下位置呢?
    我已经想了好几个小时了,都快晕了