开发环境: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 产品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语法。
解决方案 »
- 怎样将一个Table或query中的数据内容复制到另一个Table或Query中呢?
- 安装devpress出现的问题
- 问个简单问题,在线等
- 关于Delphi下的DLL编写问题
- 父窗体与子窗体的菜单合并问题
- ado连接远程数据库是以文件共享方式,还是c/s方式啊?
- 兄弟们快帮俺看看这个小问题?
- 怎样将id和name信息同时放在combobox的下拉框中?
- DELPHI ActiveX问题,急!!!!!!!!!
- 请问,在AdvstringGrid控件上的onEllipsClick事件是代表什么意思??
- string转换为char急!!!
- 程序员大本营3.0 数据库版-------------怎么样
也许会有帮助。
可编程实现!
我想,你可以用Delphi做一个小程序,先将上面的表里的数据检索出来,
然后每条判断,再对下面的数据表进行操作,这样虽然慢一些,但很安全,
如果你的数据量不超过20万条,那么与你用SQL的差别,应该用户还是能够忍受的!
sum(iif(产品='产品2',数量,0)) as 产品2,
sum(iif(产品='产品3',数量,0)) as 产品3,
...
sum(iif(产品='产品N',数量,0)) as 产品N
from 原始表
group by 代理商这是个示意性的,如果产品个数一定而且事先知道,可以直接用。
如果不是,可以在客户端先“select distinct 产品 from 原始表”,循环拼出这个语句。
这是sql 里的标准实现交叉表的方法,访问逻辑IO的次数算是较少的,inside sql 的一系列书中作者都有详细的介绍和比较!
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实现的方法.
:(
access怎么不支持iif语法????!!!我可是在access2000下测试通过了才贴上去的。不想给分可以,但不要误导大家!
写SQL于句太复杂,不过相对于别的方法却又但存许多
基本同意 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,这将导致记录唯一。
你的方法不错,测试可以通过,不过我还有一个问题,就是计算行合计和列合计,请多指点。谢谢。
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 原始表
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换一下位置呢?
我已经想了好几个小时了,都快晕了