急需高效率的SQL执行语句,快来帮帮我,我快要疯了:((100分)

  • 主题发起人 主题发起人 jobsxy
  • 开始时间 开始时间
J

jobsxy

Unregistered / Unconfirmed
GUEST, unregistred user!

表1:商品字典
Gdscode:商品编码
Classcode:类别编码


表2:商品销售流水表
Gdscode:商品编码
Saleprice:金额
SaleTime:销售日期
.....

我需要统计出在某个日期段内,某个类别所销售的商品品种数量
例如统计出2002-01-01到2002-06-30期间,乳制品共销售了10000.00元,共有58个
商品(属于乳制品类)

我现在是这样写的,但由于销售流水表太大(超过二百万条记录),需要统计多个类别,
而且有多个分店需要统计,导致完成这样的统计报表需近1小时的时间,而且遇到DDN繁忙
时,还会出现死机。

select b.gdscode from 表1 a, 表2 b
where (a.gdscode=b.gdscode) and (a.classcode=指定类别编码)
group by b.gdscode
然后用RecordCount计算出记录数。
 
select b.gdscode,count(*) from 表1 a, 表2 b
where (a.gdscode=b.gdscode) and (a.classcode=指定类别编码)
group by b.gdscode
取count就行了
 
用存储过程实现查询,应会比较快
 
两个写法都不好!因为直接对表做连接大大降低效率
如果你需要提高效率就不要直接对表1表2做连接,
而是先对表2按照商品编码分组求和后的结果(这样返回结果集少的多)
再和表1做连接
select Classcode,sum(A),sum(B)
from 表1,
(select Gdscode,A=sum(Saleprice),B=Count(*) from 表2 group by Gdscode) AS 表3
where 表1.Gdscode=表3.Gdscode

//为了得到表3时间短,你的表2的索引一定要有gdscode才更快!
 
to ugvanxk:
不行,这样写Count出的值是所售商品的数量,而我需要的不是这样,可能我没说清楚,
我还是举个例来说明我的问题吧:
如:乳制品类商品有XX1,XX2,XX3,XX4这四种
如果在我指定的日期内XX1,XX3发生了销售,那我就需要数字2,因为只有两个商品发生销售。
因此无法简单的用Count取出这个值。照您的例子取出的就是XX1,XX3所售商品的数量了,而
这并不是我所需要的。
 
select b.gdscode from 表1 a, 表2 b
where (a.gdscode=b.gdscode) and (a.classcode=指定类别编码)
group by b.gdscode
然后用RecordCount计算出记录数。----关键在这里,如果数据集很大,RecordCount会
下载所有的数据后才得出记录总数的。
你可以改成这样
select Count(b.gdscode) from 表1 a, 表2 b
where (a.gdscode=b.gdscode) and (a.classcode=指定类别编码)
group by b.gdscode
--还要在a.classcode上加索引,a.gdscode和b.gdscode上也加索引
另外,你的SQL写法是要明细表的写法,我改的是统计表写法,要注意一下数据输出的用途,
一定要把两者区分开。
 
select count(distinct b.gdscode) from 表1 a, 表2 b
where (a.gdscode=b.gdscode) and (a.classcode=指定类别编码)
 
得到了表3结果,你爱怎么做统计怎么做了,你自己研究吧

select Classcode,sum(A),sum(B),Count(gdscode) --最后一个就是你所需要那个的数量
from 表1,
(select Gdscode,A=sum(Saleprice),B=Count(*) from 表2 group by Gdscode) AS 表3
where 表1.Gdscode=表3.Gdscode
 
晕,没想到这么多人写SQL就知道表表连接!
你们知不知道表连接是做笛卡儿积运算,如果表数据量大是什么概念?
任何时候对单表做分组运算都不是大问题,如果索引建立合理的话
所以对于这个例子该先对表2先得到一个数据量小得多的中间结果再连接
 
谢谢onedot,确实给我启发很大,以前都不知道能这样写。
不过我照你的写法销改了一下,发生执行错误,是不是SQL SERVER不支持这种写法?
我再研究一下。
 
下面的语句在Access2000中通过。

SELECT [aa].Classcode, Count(*) AS 表达式1
FROM [select 表1.Classcode, 表1.gdscode from 表1 INNER JOIN 表2 ON 表1.Gdscode = 表2.Gdscode group by 表1.classcode,表1.gdscode]. AS [aa]
GROUP BY [aa].Classcode;
 
已经搞定了,从原来的近1小时到现在的不超过2分钟。
谢谢!
 
to jobsxy
是怎么搞定的,让大家借鉴一下,免得以后再出现同样问题,

 
后退
顶部