关于统计报表的制作(200分)

  • 主题发起人 主题发起人 liuxinyu
  • 开始时间 开始时间
L

liuxinyu

Unregistered / Unconfirmed
GUEST, unregistred user!
有两个表的结构如下:
一。alarmtype表:
alarmid alarmtype
1 盗窃报警
2 火灾报警
3 煤气泄漏
4 紧急求助
二。 curmsg表:
userid 用户编号
indate 报警日期
intime 报警时间
reason 报警原因
要求:制作报警统计月报表,用以按天统计各种报警的次数和百分比,类似如下格式显示结果。
日期 盗窃报警 火灾报警 煤气泄漏 紧急求助
1 20(10%) 40(20%) 80(40%) 60(30%)
2 ********* ********* ***** *****
3 ********** ******** ****** *****
4
*********************************************************************
30 ********* *********** ***** *****
合计 ********* ********* ********* *******
环境:win98+delphi6+qccess;
小弟急用,有劳各位大侠,望提供原码或SQL 语句,最好使用quickreport.


 
select day(indate) as d,
sum(case reason when 1 then
1 else
0 end) 盗窃报警次数,sum(case reason when 1 then
1 else
0 end)/count(indate) * 100 as 盗窃报警百分比,
...
where month(indate) = :date_month and year(indate) = date_year
group by day(indate)
union
select 99 as d,
sum(case reason when 1 then
1 else
0 end) 盗窃报警次数,sum(case reason when 1 then
1 else
0 end)/count(indate) * 100 as 盗窃报警百分比,
...
where month(indate) = :date_month and year(indate) = date_year
group by month(indate)
order by d
**********************************************************************************
未经测试,仅供参考!
 
为我们的公安事业做些贡献,方法笨了些,不太灵活。
定义一个表,五个字段,第一个字符型,其余数字型,作为汇总存放数据用,
定义一个数据查询A从这个表读数,当然是空记录,主要是为了和quickreport连接,
两个查询
B:select indate,reason,count(reason) from curmsg group by indate,reason
得到分日期,原因的汇总数
C:select reason,count(reason) from curmsg group by indate,reason
得到按原因分的汇总数,然后是按对应位置从B和C向A添加记录和赋值
大致如下:
for i:=1 to 30do
begin
qa.add;
qa.edit;
if qb.locate('indate,reason',vararrayof[i,1],'') then
begin
//locate参数可能不对
qa.fieldbyname('riqi').asstring:=inttostr(i);
qa.fieldbyname('f1').asfloat:=qb.fieldbyname('r1');
//其他类同
end;
end;
qa.add;
qa.edit;
qa.fieldbyname('riqi').asstring:=‘合计’;
if qb.locate('indate,reason',vararrayof[i,1],'') then
begin
//locate参数可能不对
qa.fieldbyname('f1').asfloat:=qc.fieldbyname('r1');
//其他类同
qa.fisrt
while not eof(qa)do
beign
tmp:=qa.fieldbyname('f1').asfloat+qa.fieldbyname('f2').asfloat+
qa.edit;
qa.fieldbyname('f3').asfloat+qa.fieldbyname('f4').asfloat;
qa.fieldbyname('f1').asfloat:=qa.fieldbyname('f1').asfloat/tmp;
qa.fieldbyname('f2').asfloat:=qa.fieldbyname('f2').asfloat/tmp;
qa.fieldbyname('f3').asfloat:=qa.fieldbyname('f3').asfloat/tmp;
qa.fieldbyname('f4').asfloat:=qa.fieldbyname('f4').asfloat/tmp;
qa.next;
end;
写的代码多,但没有技术难度,好理解,。
 
to dlnew:
access好低像不支持case..when..ekse..end 之类的查询吧?那么,如何写这个sql呀?
to redfax:
已用你的办法解决了,给分给你了!
 
多人接受答案了。
 
后退
顶部