如何查出指定的记录,用sql语句还是别的方法?? (150分)

  • 主题发起人 主题发起人 ddw
  • 开始时间 开始时间
D

ddw

Unregistered / Unconfirmed
GUEST, unregistred user!
如何查出指定的记录
三个表

a表:(100种车型)
全部车型
1
2


100

b表 :(40个地区)
全部地区
d1
d2
d3
:
:
d40

c表:(里面大概有3,4万条记录)
车型 地区 数量 时间(月份)
2 d40 2 1
4 d2 100 1
4 d1 8 2

………………………………
20 d8 2 12
现在我想从c表中按条件(即d表的格式)查出各条记录,然后进行计算,放入d表中

d表(例如8月份总量)这张表,就是将来要做的报表。
车型 d1(数量) d2 d3 …… d40
1
2
3
4


100

即d表中共有100条记录,以车型为中心,就是说我要在c表中,先查出所有车型为1地记录,然后在这些记录中,查出所有d1地区的记录,再查出所有8月以前的记录将数量作和,然后放入d表中第一条记录中的第一个字段。第二,再查出所有d2地区的记录,并符合8月以前的所有记录,将数量作和,放入d表中第一条记录中的第二个字段。以此类推,作出所有记录
我该怎么做,用sql语句吗,还需要双重循环吧?该怎么做,感觉计算量太大了。
另外,在d表中,有很多数量为0的结果,也就是说有的车型,在某地根本就没有卖出去。这样即是说在c表中,车型字段中,或地区字段,并不是包括a,b两表中的所有车型或地区。那如果使用sql语句的话,会出现查不出结果的时候,这时就应该将那条记录中的那个字段为0。

我的头都大了,实在不会,所以再次请教。希望你们能看懂我写的东西。
 
忘了说了,我用的是delphi+ado ,数据库用的是access2002的mdb文件
 
for i:=1 to 100 do //车型
for j:=1 to 40 do //地区
begin
adoquery1.sql.clear;
adoquery1.sql.add('select sum(数量) as total from c where 车型='+string(i)+' and 月份=8 and 地区=d'+string(j));
adoquery1.open;
将字段total的值存入表D
end;

 
呵,用其它办法好了,用存储过程,如果用CASE语句可能要晕死人的
 
Access2002 好像不支持 CASE 语句,把 mdb 导入到
SQL Server 2000(现有3,4万条记录,从性能及长远的角度考虑,值得)中,
如果不嫌 SQL 语句长的话,可以用 CASE 语句。

SELECT 车型,
SUM(CASE 地区 WHEN 'd1' THEN 1 ELSE 0 END) AS d1,
SUM(CASE 地区 WHEN 'd2' THEN 1 ELSE 0 END) AS d2,
SUM(CASE 地区 WHEN 'd3' THEN 1 ELSE 0 END) AS d3,
...
SUM(CASE 地区 WHEN 'd40' THEN 1 ELSE 0 END) AS d40
FROM C表
WHERE 月份=8
GROUP BY 车型
 
我试了一下earchbuilder的方法出来的结果好象不对,
格式是对,但统计的数量结果是这个车型在这个地区出现的次数。
而不是数量,我改了如下:
SELECT 车型,
SUM(CASE 地区 WHEN 'd1' THEN sl ELSE 0 END) AS d1,
SUM(CASE 地区 WHEN 'd2' THEN sl ELSE 0 END) AS d2,
SUM(CASE 地区 WHEN 'd3' THEN sl ELSE 0 END) AS d3,
...
SUM(CASE 地区 WHEN 'd40' THEN sl ELSE 0 END) AS d40
FROM C表
WHERE 月份=8
GROUP BY 车型
 
to eachbuilder
我使用的是delphi+ado,连接到mdb文件上,如果用case语句的话,一共需要多少句语句?
是40句还是100句,还是4000句?我不太会?
to superplayboy
where 车型='+string(i)+' and 月份=8 and 地区=d'+string(j));
是什么意思啊?我觉得好像应该从a表和b表里面取出纪录,来作为c表的选择条件之一,但实际当中,
车型并不是1到100,而是ca1099,ca10kp等等,地区的真实情况也不是,d1到d40,二是长春南关区,等等之类,如你所说。
我是不是应该在a,b表中建立一个代码字段即1,2……或d1,d2……,然后再建立真实的型号和地区的字段,然后在c表中,地区和车型都用
代码来代替啊。
 
Sorry,Thank xufeng_ok.

SELECT 车型,
SUM(CASE 地区 WHEN 'd1' THEN 数量 ELSE 0 END) AS d1,
SUM(CASE 地区 WHEN 'd2' THEN 数量 ELSE 0 END) AS d2,
SUM(CASE 地区 WHEN 'd3' THEN 数量 ELSE 0 END) AS d3,
...
SUM(CASE 地区 WHEN 'd40' THEN 数量 ELSE 0 END) AS d40
FROM C表
WHERE 月份=8
GROUP BY 车型
 
其实就一句 SQL 语句,其中有 40 个 Case 。
 
Case 语句可以用循环的方式动态生成,何必自己一个一个写呢:
var s1,dq:String;
begin
with adoquery1 do begin
sql.text:='select * from 地区 order by b表';
open;
s1:='';
while not eof do begin
dq:=fieldbyName('地区').AsString;
s1:=format('%s,sum(case 地区 when ''%s'' then 数量 else 0 end) as ''%s''',[s1,dq,dq]);
next;
end;
close;
sql.text:=format('select 车型%s from c表 Where 月份=8 Group by 车型',[s1]);
open;
end
end;
 
赞同fxWSY,不过我仅提出一种实现的方法。
 
后退
顶部