求助:一个关于统计的问题;我的积分全给你(200分)

  • 主题发起人 主题发起人 mo
  • 开始时间 开始时间
TO:dcom
tablenameB 的表名怎么去获得呢? tablenameB 的名字可能是变动的啊

 
给你做做选择题:
一、
A PO号和型号是一对多的关系 (即一PO有多个型号,但一型号只对相应的PO)
B PO号和型号是多对多的关系 (即一PO有多个型号,且一型号也对应多个PO)

二、
物料和PO、型号的关系是
A一个物料有多种PO号?
B一个物料有多种型号?
C其它?
 
TO:yhaochuan
一、这样说吧:当你下订单给你的供应商的时候,一个订单(PO)当然可以有多种物料,多个
个型号了;(可以在一张订单同时买小刀,铅笔,尺子等;但你又可以同时用不同型号的小刀,
不同型号的铅笔,不同型号的尺子吧)
再说:你这次买了5把小刀,但你在下一次又要买40把同样(型号)的小刀(只是你又要下订单,人家才
送货给你啊),这当然是可以的啊;而且还可能在第二次的时候,单价会少一点呢;
二、C:
一种物料可以有N种PO,你每下一次订单就是一种了
一种物料也可以有N种型号,还是说小刀吧,它有很多种(具体多少种是不确定的);因为在目前已
有的前提下还可以再创新品种的啊,当然型号就又多了

为此要查询某种物料的单价必须是:型号、PO号都要一至(物料名当然是一至的了)

现在的问题是:怎么样来求出各种不同型号的物料的金额?
就好比你要算你昨天买的小刀的总额:
(上午买了A型号的小刀5把,单价是1元/把;下午又买了A型号的小刀10把,单价是1.5元/把;昨天买这个型号的小刀的总额
:5*1+1.5*10=20)

希望你能继续帮助我
 
各位大侠人,来帮我吧
 
我觉得你的表结构有些问题,这样处理会有很多麻烦。
 
TO:荷塘新月
你认为应该怎么样才好点呢,能否把你的想法告诉我?
(我现在用一个表记录出货的物料,一个表记录每年各物料及PO号的单价的)

Email: mxp629@163.net
 
这么麻烦的处理,你的表定义的好像有问题。
说说思路:
先求出需要的表名
select 'PODJ200'+SUBSTRING(PO号,3,1) as tablename where ……//
再根据表名动态的生成SQL语句。
var
sql:string;
begin
sql:='';
while not query1.eof do
begin
sql:=sql+' union select PO号, 单价 from '+query1['tablename'];
end;
sql:='select sum(a.数量*b.单价) from ck200011 a, ('+sql+') b ';
query2.sql.add(sql);
query2.open;
end;

 
表名为什么是可变的,好像并没有多大意义,为何不是一个固定的表名,
加上一个标识字段来进行判断不是更容易解决问题
 
MO:
  你对物料是怎样认识的?
  好象你所说的物料不是一个东西,而是好多东西。
  比如物料1是2001-1-1买的A型号小刀
    物料2可以是2001-1-2买的A型号小刀是不是这样?
 
可编写存储过程或Delphi程序实现,应该说存储过程更有效率,
1)以下是存储过程脚本:
Create Procedure dbo.M_Query
as
Declare
@TabName varchar(20),
@UnionTab varchar(1000),
@SelectScript VarChar(2000)
Declare Cr_M Cursor for
select Distinct('PODJ20'+SUBSTRING(Po号,2,2)) as TableName from Ck200011
for read only
open Cr_M
Fetch Cr_M into @TabName
while @@Fetch_Status<>-1
begin
if @UnionTab='' or @UnionTab is null
set @UnionTab='Select Po号,单价 from '+@TabName
else
Set @UnionTab=@UnionTab+' Union '+'Select Po号,单价 from '+@TabName
fetch next from Cr_M into @TabName
end
close Cr_M
deallocate Cr_M
set @SelectScript='Select sum(数量*单价) From Ck200011 a,('+@UnionTab+') as b where a.Po号=b.Po号'
exec(@SelectScript)
2)Delphi源码
var
UnionTab:String;
SQLScript:String;
begin
AdoDataSet1.Close;
AdoDataSet1.CommandText:='select Distinct('''+'PODJ20''+'+'SUBSTRING(Po号,2,2)) as TableName from Ck200011';
AdoDataSet1.Open;

with AdoDataSet1 do
While not Eof do
begin
if UnionTab='' then
UnionTab:='Select Po号,单价 from '+FieldByName('TableName').AsString
else
UnionTab:=UnionTab+' Union '+'Select Po号,单价 from '+FieldByName('TableName').AsString;
Next;
end;
AdoDataSet1.Close;
SQLScript:='Select sum(数量*单价) From Ck200011 a,('+UnionTab+') as b where a.Po号=b.Po号 ';
end;
 
TO:yhaochuan
物料名是含有好多东西,但不是像你理解那样;
比如: A型号小刀
    B型号小刀
C型号小刀
sdfsdd型号铅笔
    asdfas型号铅笔
但这只有两种物料:小刀,铅笔
    
 
谢谢t1122
谢谢llh_lily
谢谢各位关注的大哥们的关注;

小弟的设计思路是:这里面有两个数据库子系统:1,货仓管理子系统(数据表放在DATA1中);
2,成本核算子系统(数据表放在DATA2中);
但货仓子系统的表是没有单价的;计算每月成本时就须同时访问货仓的出货的各种东东及数据量
还得访问成本子系统里各种东东的单价,但这些东东的单价又并不是放在一个表里的,但通过PO
可以确定是哪个表
一些相关的信息上面也说了很多,各位大侠们可以看看;
t1122兄的思路会试试的
我现在试试llh_lily的方法怎么样

另各位大侠们继续帮我想想办法,有什么详细想法可发邮件给我,小弟我感谢不尽
mxp629@163.net





 
MO:
  你有QQ吗?线上联系吧。
 
TO:t1122
能详细说说怎样求出需要的表名
" select 'PODJ200'+SUBSTRING(PO号,3,1) as tablename where ……// "
好吗?

TO:大侠们

看来我只有在出货登记的时候,就通过PO号,再打开相应的含有单价的表
确定好当批货的相应的单价了(改下出货登记表的结构算了)

我想这样可是可以,但每输一条出货记录就得去打开一个表,好烦的啊

大侠们,说说你们的好办法吧
 
yhaochuan兄:
我的QQ是:55875494
 
MO:
  在线吗?我请示验证没反应?
 
yhaochuan兄:
不好意思,我现在才上来的
 
to MO:
  我想如果你 也许可以尝试一下改变表结构,当然如果你不想改变表结构的话我来讲一下
我们只要在sysobjects表里获取像你这种结构的单价表名,形如:select Name from sysobjects where name like 'PODJ%' and len(name)=8
然后在存储过程利表这表名,形成一张单价表(根据需要可以过滤)
下面是设计的一个存储过程,只要你传入出货的表名,就可以汇总出这张出货表的总金额
在Delphi里只要打开存储过程,就可以得到结果值。
放心,已经测试过,完全可以
1)以下是存储过程脚本:
drop procedure prc_VarTableSum
go
create procedure prc_VarTableSum
(@InPutTB varchar(20)='ck200011')
as
begin
declare @tablename varchar(8),@PODJTableSql varchar(500),@@TotalAccount Numeric(16,2)
Declare Cur_GetTable cursor scroll for
select Name from sysobjects where name like 'PODJ%' and len(name)=8 -- 搜索符合这种表的所有表关联成一张大表
select @PODJTableSql=''
open Cur_GetTable
fetch first from Cur_GetTable into @tablename
while ((@@fetch_status<>-1))
begin
if len(@PODJTableSql)=0
select @PODJTableSql='select * from '+@tablename
else
select @PODJTablesql=@PODJTableSql+' union select * from '+@tablename

fetch next From Cur_GetTable into @tablename

end
close Cur_GetTable
deallocate Cur_GetTable
select @PODJTablesql='select sum(isnull(M.数量,0)*isnull(P.单价,0)) as TotalCost from '+@InPutTB+' M ,('+@PODJTablesql+ ') P where M.Pho=P.Pho'
exec(@PODJTablesql)

end;


2)Delphi源码
ADOStoredProc1.Close;
ADOStoredProc1.Parameters.ParamByName('@InPutTB').value:='ck200011';
ADOStoredProc1.open;
变量:总金额:=ADOStoredProc1.Fields[0].value

 
 
我的方法:
本来设计时应当把各年份的单价放到一个表里,用一个年份来字段来区分。现在
既然已经事情发生了,我想可用以下办法较简单。先把各年份的单价集中到一个表里,
用如下语句:
select alldj.* into #dj from
(select '01' as year, * from dataB.dbo.PODJ2001
union select '02' as year, * from dataB.dbo.PODJ2002
union select '03' as year, * from dataB.dbo.PODJ2003
union ....
) alldj

然后,
select sum(aa.数量*bb.单价) as 总金额
from dataA.dbo.ck200011 aa inner join #dj bb
on SUBSTRING(aa.PO号,3,1) =bb.year and aa.po号=bb.po号

不过要考虑到一百年后你的程序还能用,还得动动脑筋。
我是sql2000高手!!





 
SUBSTRING(aa.PO号,3,1) =bb.year
应当是
SUBSTRING(aa.PO号,3,2) =bb.year
或者这个条件完全可不要
即:
select sum(aa.数量*bb.单价) as 总金额
from dataA.dbo.ck200011 aa inner join #dj bb
on aa.po号=bb.po号


 
后退
顶部