求合计!!!急!!!!(30分)

  • 主题发起人 主题发起人 yippee
  • 开始时间 开始时间
Y

yippee

Unregistered / Unconfirmed
GUEST, unregistred user!
有如下表:
部门 年份 月份 日期 产量
1 1997 1 5 10
1 1997 1 19 5
2 1997 2 7 8
。。。。。。。
n 1999 12 7 9
要求上一年11月到第二年3月上旬产量的和
请教这个sql该怎么写??
谢谢



 
应该编一个过程可以实现

select sum(产量)
FROM TABLE
WHERE (年份=PARAM1)AND(月份>11) OR (年份=PARAM2)AND (月份<=3)and (日期<11)
 
但是年份不是固定的呀
比如:要求10年里每一年的合计(1987/11-1988/3 ,1988/11-1989/3,。。。。)
以此类推
是不是对“年份”应该有个类似:‘去年+1’什么的吧
请继续指点
 
select sum(产量)
FROM TABLE
WHERE (年份=:PARAM)AND(月份>11) OR (年份=:PARAM+1)AND (月份<=3)and (日期<11)
 
但是这个PARAM该怎样设呢?
 
select sum(产量)
FROM TABLE
WHERE (年份=:PARAM)AND(月份>11) OR (年份=:PARAM+1)AND (月份<=3)and (日期<11)
parambyname('PARAM').asstring:=edit1.text;
edit1.text中可输入年份。
 
如果是10年里每一年的合计,你可以用循环来实现的。在Sql中用游标也行。
这个问题也就是年份的确定问题,是自动还是手工输入,是把?
 
写个函数来生成 SQL查询语句,比如:
function getSQLText(startyear,endyear: integer): string ;
var
s_year,e_year: integer;
s1,s2: string;
begin
s_year := startyear;
e_year := s_year + 1;

s1 := ''; s2 := '';

if e_year > endyear then
result := ''
else
begin
s1 := ' select ' + '''' + inttostr(s_year)
+ '-' + inttostr(e_year) + '''' + ' as 日期, sum(产量)as 产量 ';
s1 := s1 + ' From table ';
s1 := s1 + ' WHERE ((年份='+inttostr(s_year)
+')AND(月份>11)) OR ((年份='+inttostr(e_year)
+')AND(月份<=3)and(日期<11)) ';

s2 := getSQLText(e_year,endyear);

if s2 = '' then
result := s1
else
result := s1 + #13 + ' UNION ' + #13 + s2;
end;
end;

调用:
Query1.Close;
Query1.SQL.Text := GetSQLText(1990,2000);
即可得到 1900 到 2000 年间的各年合计数据。

如果数据库支持存储过程,也可以用存储过程来做。
 
to: wutianbin
如果在前台计算的话,会不会效率太低??
TO :FOOLALIU:
年份是自动的,比如数据库理每月都会增加数据
要求数据库里所有年份

还请各位继续指教呀
 
to: wutianbin
如果在前台计算的话,会不会效率太低??
TO :FOOLALIU:
年份是自动的,比如数据库理每月都会增加数据
要求数据库里所有年份

还请各位继续指教呀
 
那这样吧
create table #temp1
(年份 int
)
create table #temp2
(年份 int,
产量 int
)

insert #temp1 select 年份 from table group by 年份
declare @iYear int
declare cur_tmp cursor
for
select 年份 from #temp1
open cur_tmp
fetch next from cur_tmp into @iYear
while @@fetch_status=0
begin
insert #temp2
select @iYear,sum(产量)
from table
where (年份=@iYear-1 and 月份>=11)
and (年份=@iYead and 月份<=3 and 日期<11)
fetch next from cur_tmp into @iYear
end
close cur_tmp
deallocate cur_tmp
select * from #temp2

#temp2中存放的就是每一年3月上旬至前一年11月这段时间内的产量

可以把这段代码改成存储过程,而后每次查询的时候调用就行了
 
不是在前台计算,我那是在程序中生成一个很长很长的
SQL语句(年份越多就越长),然后用该语句来查询数据,
前台只生成语句,效率绝对不低。

都让后台来处理,只想用一个SQL语句是不可能的。
当然,用存储过程是最好的。

另外,您可以先建立一个本地表(.dbf,.db 等),然后
用个循环过程把数据添加到建立的表中,再后,查该表里
面的数据。(不过,这样做效率很低)
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
926
DelphiTeacher的专栏
D
D
回复
0
查看
790
DelphiTeacher的专栏
D
D
回复
0
查看
781
DelphiTeacher的专栏
D
D
回复
0
查看
718
DelphiTeacher的专栏
D
后退
顶部