这个查询功能怎么完成?不算简单吧! (100分)

  • 主题发起人 sanjianxia
  • 开始时间
S

sanjianxia

Unregistered / Unconfirmed
GUEST, unregistred user!
表1结构:
r101 r102 r103 r104 r105 r106 r201 r301 r302......
----------------------------------------------------
AE b cA a e j z h k........
..............................................
b c DE A H K H ABE E........
表2结构:
项目 总数 a ab b bb c cb d.......
----------------------------------------------------
r101
r102
....
大家可能看出来了,上面是一个调查的统计程序,要求从表1中分别统计各个项目的总量,以及选择该项目为A到Z的各为多少,以及占选这道题的比例是多少。
请大家帮帮忙,我觉得比较麻烦,对了,尽管给源码。
 
不是简单地用一两条 SQL 可以解决的吧?!
 
当然不是,而且一小段程序才能够解决。哈哈。能够解决吗?可能要用循环。
 
对了,我是采用服务器端用sqlserver表的。
只写统计部分源码,其它联结代码等我已经写好了。
 
估计很难,你已经建好表了
不如利用存储过程添加和修改记录,随时更改对应值的数量
或利用触发器
 
我上面的数据已经输入完,只等统计数据了。有好办法解决吗?
 
var
FQuery: TADOQuery;
I: Integer;
begin
FQuery := TADOQuery.Create;
try
FQuery.Connected := 'your data path';
FQuery.SQL.Text := 'select r101 from Table1 where r101='+''a'';
I := FQuery.Recored; //和你的总数相比就是占有率了
finally
FQuery.Free;
end;
end;
 
这个东西用存储过程写吗,用程序的话是有一大堆代码的,而且容易出错

墙头草的这个不对的
 
看看我的部分代码。
var
xx:string; //接收项目名
hj:integer;
sqlstr:string;
sumresult:real; //总量
result:real; //具体值
begin
adotable1.Open;
adotable1.First;
while not adotable1.Eof do
begin
xx:=trim(adotable1.fieldbyname('项目').AsString);
adoquery1.Close;
adoquery1.SQL.Clear;
sqlstr:='select '+trim(xx)+' from input where '+trim(xx)+' is not null or '+trim(xx)+'<>''''';
adoquery1.SQL.Add(sqlstr);
adoquery1.Open;
sumresult:=adoquery1.Recordset.RecordCount;
adotable1.Edit;
adotable1.FieldByName('总数').AsFloat:=sumresult;
form1.StatusBar1.Panels[0].Text:='正在统计:'+trim(xx)+'总量';
hj:=65;
while hj<92 do
begin
adoquery1.Close;
adoquery1.SQL.Clear;
sqlstr:= 'select '+trim(xx)+' from input where '+trim(xx)+' like '%'+chr(hj)+'%';
adoquery1.sql.Add(sqlstr);
adoquery1.Open;
result:=adoquery1.Recordset.RecordCount;
adotable1.Fields[(hj-64)*2].AsFloat:=result;
hj:=hj+1;
end;
adotable1.Next;
end;
问题是在sql中显示包含的字符参数出错。
 
我看应该在数据库中写一个自定义的函数参数就是表1的FieldName和表2的对应FieldName.
在这个自定义的函数里统计该对应项的数值。
 
这个问题我已经解决了。不过分还是分给关心这个问题的大家。
 
多人接受答案了。
 
顶部