急求一个查询过程的解决办法,小弟对SQL一窍不通,领导急要,谢谢大家啊!
是气象部门的一个降雨评分程序,领导突然发疯明天就要要这个东西,压给小弟,失败啊,解决后可再赠送500分作为酬谢,以姓氏作担保,决不食言,请大家帮我写一下啊……共有3个表,表A是实况值,表B是预报值,表C是每天评分的结果,几个表的结构如下:
表A:实况值
SID date value
50136 20070212 31
50136 20070213 20
50136 20070214 15
……
表A说明:SID字段是台站编号,date是日期,value是降水量。
表B
SID date 1 2 3 4
50136 20070211 0 0 1 2
50136 20070212 0 1 2 3
……
表B说明:SID字段是台站编号,date是预报日期,字段1、2、3、4分别代表时间步长,1代表20070211这天的后一天,即报20070212日降水量级是0;2代表后两天,即20070213,以此类推;降水量级表示如果是0就是无降水,如果是小于等于10就是1,如果是小于等于20就是2,以此类推,表A中12、13、14日的降水量所对应的量级分别是4、2、2。
表C
SID date Avalue Bvalue Span
50136 20070211 4 0 1
50136 20070211 2 0 2
……
表C说明:SID字段是台站编号,date是预报日期,这两个跟前面一样的意思,Avalue和Bvalue分别是表A和表B中相对应时间步长(Span字段)下的降水量级。如第一行表示50136这个台站在20070211日报的明天的(Span=1)量级是0,但实况是4,报的后天(Span=2)的量级是0,实况是2,以此类推。
要求做出来一个每天可以自动运行的程序,最好是利用SQL自己的脚本或者C#编写的程序,每天运行后把结果更新到表C中。
要注意的是台站不仅只有50136,大概有100多个,每一个台站都要这么做,即每个台站每天都要做它后面四天的预报结果的评分。
谢谢大家了啊!
[解决办法]
没有验证,不知道对不对
insert into 表C(sid,date,avalue,bvalue,span)
select sid,
date,
(select case when value between 1 and 10 then 1
when value between 10 and 20 then 2
when value between 20 and 30 then 3
when value between 30 and 40 then 4 else 0 end
from 表A a
where cast(a.date as datetime)=dateadd(day,1,cast(b.date as datetime)) and a.sid=b.sid),
[1],
1
from 表B b
union all
select sid,
date,
(select case when value between 1 and 10 then 1
when value between 10 and 20 then 2
when value between 20 and 30 then 3
when value between 30 and 40 then 4 else 0 end
from 表A a
where cast(a.date as datetime)=dateadd(day,2,cast(b.date as datetime)) and a.sid=b.sid),
[2],
2
from 表B b
union all
select sid,
date,
(select case when value between 1 and 10 then 1
when value between 10 and 20 then 2
when value between 20 and 30 then 3
when value between 30 and 40 then 4 else 0 end
from 表A a
where cast(a.date as datetime)=dateadd(day,3,cast(b.date as datetime)) and a.sid=b.sid),
[3],
3
from 表B b
union all
select sid,
date,
(select case when value between 1 and 10 then 1
when value between 10 and 20 then 2
when value between 20 and 30 then 3
when value between 30 and 40 then 4 else 0 end
from 表A a
where cast(a.date as datetime)=dateadd(day,4,cast(b.date as datetime)) and a.sid=b.sid),
[4],
4
from 表B b
[解决办法]
--创建测试环境
create table 实况值(SID int,date datetime,value int)
create table 预测值(SID int,date datetime,[1] int,[2] int,[3] int,[4] int)
--插入测试数据
insert 实况值(SID,date,value)
select '50136 ', '20070212 ', '31 ' union all
select '50136 ', '20070213 ', '20 ' union all
select '50136 ', '20070214 ', '15 '
insert 预测值(SID,date,[1],[2],[3],[4])
select '50136 ', '20070211 ', '0 ', '0 ', '1 ', '2 ' union all
select '50136 ', '20070212 ', '0 ', '1 ', '2 ', '3 '
create table 分析表(SID int,date datetime,Avalue int,Bvalue int,Span int)
--求解过程
insert 分析表
select b.sid,b.date,(a.value+9)/10 as Avalue,b.value as Bvalue,b.span
from 实况值 a
join(
select SID,date,[1] as value,1 as span from 预测值 union all
select SID,date,[2] as value,2 as span from 预测值 union all
select SID,date,[3] as value,3 as span from 预测值 union all
select SID,date,[4] as value,4 as span from 预测值
) b on a.date = b.date + span and a.sid = b.sid
order by b.date,b.span
select * from 分析表
--删除测试环境
drop table 实况值,预测值,分析表
/*--测试结果
SID date Avalue Bvalue Span
----------- ------------------------------------------------------ ----------- ----------- -----------
50136 2007-02-11 00:00:00.000 4 0 1
50136 2007-02-11 00:00:00.000 2 0 2
50136 2007-02-11 00:00:00.000 2 1 3
50136 2007-02-12 00:00:00.000 2 0 1
50136 2007-02-12 00:00:00.000 2 1 2
(所影响的行数为 5 行)
*/