一个简单的数据库查询的问题(50分)

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

BAISONWAN

Unregistered / Unconfirmed
GUEST, unregistred user!
我是个菜鸟,刚开始学DELPHI,碰到一个问题,想请教各位大虾,还望不吝赐教[:D]
我需要做的程序大致是统计日平均销售的,内容如下:
总部想查询下属每个直营店的销售情况,因为每款商品的上货日期不同,每个商店上货的商品不同,所以想实现:1.查询某一个商店所有商品自第一次上货日期以来的所有销售情况;2.查询某一个商店某一款商品销售情况;3.查询同一款商品不同商店自它们上货日期以来的销售情况;
查询条件
1.商店 2.商品(可以选择按名称,代码查询)
查询结果
商店名称 商品代码 商品数量 上货日期 当前系统日期 上货天数 数量/天数(即日平均销售)
商店名称存在商店配货单SDPHD里,字段是SDMC;
商品代码在零售销货单明细LSXHDMX里,字段是SPDM;
商品数量在零售销货单明细LSXHDMX里,字段是SL;
上货日期存在商店配货单SDPHD里,字段是RQ,要取这款商品在这个店的最早上货日期;
上货天数为系统日期-最早上货日期。

我现在的问题有:
1.上货天数,因为那个表里有不同商店每次配货的日期,如何取最早?然后是统计天数,怎么减才能保证天数正确?
2.商品要和商店关联,不是每款商品在某一个店都有配货,而且每个店的同款商品配货日期也不同,这些数据在2个几张表里,就是说,当我选择查询条件时,弹出窗口包含所有商店,我可以只选一个商店,然后可以点统计;或者当我想在加商品做查询条件时,点击选择,然后弹出窗口包含这个商店的所有配过货的商品,我选择以后点统计,统计出这款商品在这个店自上货以来的销货总数,上货天数,日平均销售。
 
老兄用的是MSSQL作后台数据库吗?
看上去用SQL语句应该很容易解决呀!
 
数据库是哪个呢?
在查询里用聚程函数就可以。
技术交流QQ:136293586
 
说得不清楚,而且做起来最好用存储过程来处理(比如,上货天数:这个就要处理,是否隔年,是否闰年(二月天数问题)。。。。。)
 
对,用的是SQL SERVER2000,数据库已经做好了,我现在做的这个只是针对数据库进行查询而已,,要考虑到间隔年的情况,如果是去年上货的,统计到今年,上货天数如何保证正确
 
哪个大虾最好能帮忙写点代码,不胜感激[:)]
 
你自己修改一下不同表的连接代码吧:
select 商店名称,商品代码,sum(商品数量) as 商品数量,min(上货日期) as 上货日期,getdate() as 当前系统日期,datediff(day,min(上货日期),getdate()) as 上货天数,sum(商品数量)/datediff(day,min(上货日期),getdate()) as [数量/天数] from table3 group by 商店名称,商品代码
 
我现在上网的地方QQ登录不上,只能浏览网页,所以如果136293586晚上有空的话,我希望能交流下
 
多谢赐教,dey-999,请问下,就是把这段代码加进“统计”按钮就OK了是吗?
 
执行一下下面的就可以了,返回数据则ViewMsg:=True
function ExeSQL(Tb: TADOQuery; aSQL: String; IsOpen: boolean=true;ViewMsg :BOOLEAN=FALSE): boolean;//运行SQL
Function AutoConnectDb(Cn:TADOConnection):boolean;
begin
try
CN.Connected := TRUE;
result := true;
except
result := False;
end;
end;
procedure DoWriteLog(TB:TADOQuery;s:string;ViewMsg :BOOLEAN=FALSE;IsOpen: boolean=true);
var E:ADOInt.Errors;
err: error;
OpenCn:Boolean;
BEGIN
e := TB.Connection.Errors;
if e.Count>0 then begin
err := E.Item[0];
S := S + ' :' + INTTOSTR(err.Number);
if err.Number= -2147467259 then begin
TB.Connection.Close;
OpenCn := False;
WHILE not OpenCn do BEGIN
OpenCn:= AutoConnectDb(TB.Connection);
END;
Tb.Close;
if IsOpen then begin//打开数据库
Tb.Active := true;
end else begin
Tb.ExecSQL;
end;
end;
end;
IF ViewMsg THEN BEGIN
if IsOpen then
Application.messageBox('数据库打开出错!','提示!',Mb_ok+MB_ICONINFORMATION)
else
Application.messageBox('SQL语句执行出错!','提示!',Mb_ok+MB_ICONINFORMATION);
END;
END;

begin
result := false;
TB.Filtered := false;
TB.Filter := '';
Tb.Active := false;
Tb.SQL.Clear ;
Tb.SQL.Add(aSQL);
try
if IsOpen then begin//打开数据库
tb.executeoptions := [];
Tb.Active := true;
end else begin
tb.executeoptions := [eoExecuteNoRecords];
tb.Parameters.Clear;
Tb.ExecSQL;
end;
result := true;
except
on E: Exception do DoWriteLog(tb, timetostr(Time) + ': ' + aSQL+#13#10 + e.Message +#13#10 ,ViewMsg,IsOpen);
end;
end;
 
接受答案了.
 
能告诉我你的QQ吗,我的是125890115,我们公司的局域网现在都上不了QQ,不晓得出了什么问题[?]晚上回去我加你,希望以后能多多交流[:)]
 
后退
顶部