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

  • 主题发起人 主题发起人 mo
  • 开始时间 开始时间
to mo:
我觉得你有些想法是错误的。
不需要担心sql每个表的数据量,sql的数据量可以很大(几百万条以上)。
当然对数据量大的数据库操作会导致响应速度慢,为了提高响应速度应当从这几方面
考虑:
1、硬件:cpu速度、内存(1G以上)、硬盘(最好用阵列柜)。那么庞大的一个系
统,肯定要在硬件上舍得花点钱。
2、通过对sql的索引进行优化(可使用sql的分析器来进行分析),提高对常用
查询响应速度。
3、把表分开也许会对小范围查询的响应速度会有提高,具体有多大提高,没试过。
如果我来做的话,我会把这些表分成两个,而不是每年一个。一个叫
当前年份xx表,另一个叫历史xx表。每次统计查询时,先判断一下日期范围是否
跨年,如果不跨年就只对当前年份xx表进行查询统计;否则,通过
联合查询(union)把两个表合成一个表进行查询统计。这样做可以达到对最常
用的(当前年的)数据查询统计比较快,又可以达到编程及维护方便的目的。
毕竟跨年度的统计用的次数少,慢一点也没关系。我总觉得每年一个表太麻烦。
希望有更高水平的dfw再来讨论一下。
 
to mo
看来听热闹,求需要的表名
" select 'PODJ200'+SUBSTRING(PO号,3,1) as tablename where ……// "
不过是举了个例子,是针对sqlserver的。不同的数据库可能有所不同。
'PODJ200'+SUBSTRING(PO号,3,1) 时字符串'PODJ200'和“PO号“的第三位之和,如果“PO号“的第三位
是'1',那么该表达式就是PODJ2001;是'2',那么该表达式就是PODJ2002,就是说动态的
求得数据表的名。
 
很明显在数据库的设计上就存在缺陷。你不能拿数据库表的名字来做为统计运算的条件,
这样不符合关系数据库的要求,因为你不能用数据库表的名字来做关系运算。

{ ------------- 引用 --------------}
表 ck200011 (指2000年11月份的出货登记表)
物料名 型号 PO号 出货数量
a1 1abc N010012 50
s www N020123 20
xyz 2343 N013424 90
s 4321 N013427 1000
...
:PODJ2002 (好比2002年的单价登记表)
物料名 型号 PO号 单价 交货期
s www N020123 7.50 2002-1-2
...

:PODJ2001 (好比2001年的单价登记表)

物料名 型号 PO号 单价 交货期
a1 1abc N010012 3.4 2001-5-9
xyz 2343 N013424 63.75 2001-10-8
s 4321 N013427 3.45 2001-8-10
{ ------------- 引用 --------------}

你如果这样来设计你的表,应该会更合适:
create table ck( //出货记录表
nf smallint not null, //年份
yf smallint not null, //月份
...
);
create table podj( // 单价登记表
nf smallint not null, //年份
...
);
这样求2000年11月的总额就可以很轻松地一个SQL搞掂:
select a.物件名, sum(a.数量) * b.单价 金额 from ck a, podj b
where a.nf=2000 and a.yf=11
and b.nf=a.nf and b.PO号=a.PO号
group by a.物件名
得到的结果是2000年11月每个物件的出货金额列表。
 
不好意思这么久才分分;分得不合理的地方请各位多多包含
 
后退
顶部