表字段有:站号、日期、气温
主键为站点和日期 现在要得到本年某个时间段的气温总和,以及常年这个时间段的气温总和,最后计算二者的差,用来比较本年和常年此时间段累计气温。
比如用户选择了1971到2000年代表常年,现在要计算2009年1月1号到31号的气温总和;还要计算1971年到2000年每年的1月1号到31号的气温总和,然后将30个值进行平均,这就是常年值。
要显示的就是2009年的1月气温总和、常年值、二者的差值请问这个select语句该怎么写?比较复杂,我都晕了。
主键为站点和日期 现在要得到本年某个时间段的气温总和,以及常年这个时间段的气温总和,最后计算二者的差,用来比较本年和常年此时间段累计气温。
比如用户选择了1971到2000年代表常年,现在要计算2009年1月1号到31号的气温总和;还要计算1971年到2000年每年的1月1号到31号的气温总和,然后将30个值进行平均,这就是常年值。
要显示的就是2009年的1月气温总和、常年值、二者的差值请问这个select语句该怎么写?比较复杂,我都晕了。
解决方案 »
- 请问 oracle 会自己保存一些建表 建立试图,包括建立索引的脚本么?
- exp imp 导出导入 问题
- oracle 截取字符 如何不将汉字截成两端
- t_order_list 表的sex字段 为0和1 表t_ddw 中的 DD_ITEM_CODE (0,1)和 DD_ITEM_NAME(男和女)
- 如何获取自某个时间以来改动过的记录?
- ORACLE 发送邮件的进程
- 请问如何更改oracle的系统时间?
- 这个触发器怎么实现?
- 将一个表中某字段多出的值写到另一个表中,脚本怎么写才正确?(提供了SQL Server的思路,Oralce的如何写)
- []200分[]在oracle中用分布式有什么好处?在什么情况下必须使用?????分布式包含那些方面???
- 面试题,请高手们看看
- sq优化?
站号 日期 气温
SITES DAYDATE TEMPER
1 2001-1-1 5
2 2001-1-1 4
3 2001-1-1 6
1 2001-1-2 3
2 2001-1-2 5
3 2001-1-2 7
1 2002-1-1 5
2 2002-1-1 4
3 2002-1-1 6
1 2002-1-2 5
2 2002-1-2 2
3 2002-1-2 5
1 2003-1-1 4
2 2003-1-1 5
3 2003-1-1 1
1 2003-1-2 6
2 2003-1-2 2
3 2003-1-2 32、Sql语句如下:
2003年的1月气温总和、2001-2002常年值、二者的差值。 Select A1.站号, A1.气温总和, A2.常年值, A1.气温总和 - A2.常年值 As 二者的差值
From (Select T1.Sites As 站号, Sum(T1.Temper) As 气温总和
From Temperature T1
Where To_Char(T1.Daydate, 'YYYYMM') = '200301'
Group By T1.Sites) A1,
(Select T2.Sites As 站号, Sum(T2.Temper) / 2 As 常年值
From Temperature T2
Where To_Char(T2.Daydate, 'YYYYMM') Between '200101' And '200201'
Group By T2.Sites) A2
Where A1.站号 = A2.站号;
查询结果如下:
站号 气温总和 常年值 二者的差值
1 10 9 1
2 7 7.5 -0.5
3 4 12 -8
并且“To_Char(T2.Daydate, 'YYYYMM') Between '200101' And '200201' ”
这么写成了计算2001年1月到2002年1月的了,它们中间有13个月了,而我只要计算每年的特定时段。
from
(select 站号,sum(气温) 气温,count(*) num
from tb where 日期 between '2009-01-01' and '2009-01-02' group by 站号)a,
(select 站号,sum(气温) 气温,count(*) num
from tb where 日期 between '1971-01-01' and '2000-01-02' group by 站号)b
where a.站号=b.站号
但是常年值应该是1971年1月1号到1971年1月2号的气温之和、1972年1月1号到1972年1月2号的气温和、1973年1月1号到1973年1月2号的气温和......、1999年1月1号到1999年1月2号的气温和、2000年1月1号到2000年1月2号的气温和。
而不是把1971到2000年所有日期的气温都一股脑加起来。
from
(select 站号,sum(气温) 气温,count(*) num
from tb where 日期 between '2009-01-01' and '2009-01-02' group by 站号)a,
(select 站号,agv(气温/num) 平均气温,count(*) 年数
from (select 站号,substr(to_char(日期,'YYYY-MM-DD'),1,4) 年份,sum(气温) 气温,count(*) num
from tb
where substr(to_char(日期,'YYYY-MM-DD'),1,4) between '1971' and '2000'
and substr(to_char(日期,'YYYY-MM-DD'),6,5) between '01-01' and '01-02' group by 站号
group by 站号,substr(to_char(日期,'YYYY-MM-DD'),1,4)
) group by 站号
)b
where a.站号=b.站号