我有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;
这样做统计速度奇慢,有什么好办法可以加快统计速度吗?
总公司 第一分公司 部门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;
这样做统计速度奇慢,有什么好办法可以加快统计速度吗?
select count(*) as 数量 from 设备配发表 as a
left join 部门表 b on a.部门id = b.id
left join 设备表 c on a.设备id = c.id
这句话我想就应该能够实现你的功能,试一下
select count(*) as 数量 from 设备配发表 as a
left join 部门表 b on a.部门id = b.id
left join 设备表 c on a.设备id = c.id
group by a.部门ID,a.设备ID
你用了这么多的循环,而且还用到了like操作,速度当然慢的很
您说的语句我试了一下,得到的结果不太对
left join 部门表 b on a.部门id = b.id
left join 设备表 c on a.设备id = c.id
group by a.部门ID,a.设备ID,这样写,然后你检查一下哪里错了,基本思路就是这样的,
语句也不一定非的这样写,只是提供一个思路,不要用这么多的循环
您说的语句得到的结果是设备配发表中有记录的设备统计,而我想得到所有设备的的配发统计
to hare007(hare):
由于部门编号和设备编号存在层次(树形结构),所以需要统计同级的数量之和,所以用到了like。