access数据库多表查询统计的问题(100分)

  • 主题发起人 主题发起人 bbcock
  • 开始时间 开始时间
B

bbcock

Unregistered / Unconfirmed
GUEST, unregistred user!
我有3个表分别是设备表(id,设备编号,设备名称),部门表(id,部门编号,部门名称),设备配发表(设备id,部门id),我想查询统计出如下结果:


总公司 第一分公司 部门1 部门2 部门3 第二分公司 部门1 部门2

所有设备 10 6 3 2 1 4 2 2
a类设备 8 5 2 2 1 3 2 1
计算机 3 1 1 0 0 1 1 0
打印机 3 1 1 0 0 1 0 1
传真机 2 1 0 1 0 1 1 0
扫描仪 2 2 0 1 1 0 0 0
b类设备 2 1 1 0 0 1 0 1
空调 1 1 1 0 0 1 0 1
电扇 1 0 0 0 0 0 0 0


我现在是这么做的
1,把设备表的所有记录按编号顺序查询出来adoquery1
2,把部门表的所有记录按编号顺序查询出来adoquery2
3,嵌套循环
adoquery2.First;
for i:=1 to adoquery2.recordcount do
begin
bmbh:= ADOQuery2.FieldValues['部门编号'];
ADOQuery1.First ;
While Not ADOQuery1.Eof Do
Begin
sbbh:= ADOQuery1.FieldValues['设备编号'];
sqlstr:='select count(*) as 数量 from 设备表 as a,部门表 as b,设备配发表 as c where a.id=c.id and b.id=c.id and a.设备编号 like'''+sbbh+'%'+''''+' and b.部门编号 like'''+bmbh+'%'+''''
with adoquery3 do
begin
close;
sql.Clear;
sql.Add(sqlstr);
open;
end;
得到数量
Adoquery1.Next ;
end;
Adoquery2.Next ;
end;


这样做统计速度奇慢,有什么好办法可以加快统计速度吗?
 
速度慢主要上你在循环中重复用到Close ,Open;你用这样做也只是为了获取一个总和。
你应该尽量用Group by来得到Count 不用每次都去通过Open获取 ,我看到你可能要对某一类设备进行汇总“a类设备”,你可以用Group by substring('',,)来解决。当然你的需求可能只用一次Group by 不能得到所有的Count ,可以用多次。这样会加快你的速度。
 
to strongburn:
我对sql语句不太熟悉,您能详细说说吗?谢谢!
 
SELECT 设备id, 部门id, COUNT(*) AS 数量
GROUP BY 设备id, 部门id
 
用存储过程临时表
 
to 网中戏:
access也可以用存储过程吗?

to macwong:
您的sql语句肯定不对
 
你可以按照他的思路试试看:
SELECT 设备id, 部门id, COUNT(*) from 设备表 AS 数量
GROUP BY 设备id, 部门id;
应该就是笔误少些了个from吧
 
to xounter:
你这样的语句结果会是设备数*部门数的合计,不是我要的结果
 
你想要的是什么样的结果集,按照你原来的语句就是一个一个算出来的。
 
这样的二维表格很难用一个语句写出来吧?请高手指点一下,偶也有遇到这样的问题需要解决,帮忙顶一下!
 
to hityou:
我要的结果已经在前面列出了,我现在的办法速度奇慢,我想sql语句应该可以解决这个问题。

此类统计应该很常见吧?期待高手出马[:)]
 
123SOHO网 ,已成功打造许多高收入的会员。

需要了解的加我QQ497629864
承诺:项目不存在赔钱的可能,你投的钱3个月内如没有回报,我们退款。关键是你有多大的能力,你能赚多少钱。
天下没有免费的午餐,不努力可没钱赚。
6个月时你努力的话,月工资到白领基层没问题。


上面的项目是网络营销——你现在所需要的只是了解它——
机会是你自己来把握的
联系网站http://123soho.net/index_head.asp?id=yy66
 
问题已解决,谢谢大家!

速度慢的原因strongburn已经说了
解决方法:1。sql语句查询,group by 分组
2。写入stringgrid,自己计算数量

现在250*450的统计速度在2-3秒左右,如果不用sql查询分组,直接stringgrid计算,估计速度更快
 
后退
顶部