现有两张表:
第一张 第二张
RainSite(雨量站表),字段如下: Rain (雨量表),字段如下:
ID SiteName Town ID SiteName RainValue RainTime
1 站点一 乡镇一 1 站点一 8 2011-04-05 8:00:00
.... ...现在要获取下面这张图的数据:有必要对这张图说明一下,根据传递过来的一个时间段,来获取数据,难点在常年这列的值
常年:是数据库中Rain表中所有年份的该时间段雨量的总和的平均值。现求一SQL,根据一个时间段,来获取数据。
第一张 第二张
RainSite(雨量站表),字段如下: Rain (雨量表),字段如下:
ID SiteName Town ID SiteName RainValue RainTime
1 站点一 乡镇一 1 站点一 8 2011-04-05 8:00:00
.... ...现在要获取下面这张图的数据:有必要对这张图说明一下,根据传递过来的一个时间段,来获取数据,难点在常年这列的值
常年:是数据库中Rain表中所有年份的该时间段雨量的总和的平均值。现求一SQL,根据一个时间段,来获取数据。
解决方案 »
- 联合主键 插入报重复
- 初学菜鸟问题
- 求一列变多列而且要并记录的SQL 指。
- 在桌面上单击"开始"菜单,指向"程序"子菜单、"Microsoft SQL Server"子菜单、"Analysis Services"子菜单,然后单击"Analysis Manager"命
- 请问 能不能用 T-sql 语句 将 想要 的数据 导出 成 excel 和 access 和 html 文件?????
- ★50元求购软件可以监测SQLServer2000中数据库表变化的情况
- 查询问题,征示简单方法
- 关于ACCESS密码加密转换成SQL的问题
- 查询并过滤重复项
- Sql中sum(nvarchar类型)查询上月的rkzj(入库总价)
- sql2005 连接本地出错,求解 A network-related or instance-specific error occurred..
- SQL server安装警告,SQL Server 版本的操作系统兼容性 (警告)
SELECT 雨站 ,
SUM(雨量) ,
AVG(雨量)
FROM tb
WHERE 时间 BETWEEN 开始时间 AND 结束时间
GROUP BY 雨站
我现在查2011-04-06 8:00:00 至 2011-04-08 8:00:00数据 还有个比较的年份比如说是2010年
取这个时间段得雨量和统计很方便,比较年份的雨量也可以,但是最重要的是要取常年
常年的意思,举个例子吧,数据中有2009年 2010年 2011年这三年的数据,这个常年的数据是
2009-04-06 8:00:00 至 2009-04-08 8:00:00 假如总和是 100
2010-04-06 8:00:00 至 2010-04-08 8:00:00 假如总和是 150
2011-04-06 8:00:00 至 2011-04-08 8:00:00 假如总和是 250
这三个年份时段雨量总和然后除以3(3年数据)
即常年数据是:(100+150+250)/3 = 150现在想要最终一条SQL语句,根据条件查出所有站点某个时间段得数据。
(
雨量站,雨量,年份,时段
)
as
select [雨量站], [雨量], CONVERT(varchar(4),year([时间])),right(CONVERT(varchar(20),[时间],20),14)
FROM [实测雨情表];CREATE FUNCTION Rain_F1
(@bdt varchar(20),
@edt varchar(20))
RETURNS TABLE
AS
BEGIN
RETURN
( select [雨量站],[年份],sum([雨量]) [雨量] from Rain_V1
where 时段 between @bdt and @edt
group by [雨量站],[年份]
);
END
GOCREATE FUNCTION Rain_F2 (@bdt varchar(20),
@edt varchar(20))
RETURNS TABLE
AS
RETURN
(
select [雨量站],[年份],sum([雨量]) [雨量] from Rain_V1
where 时段 between @bdt and @edt
group by [雨量站],[年份]
);
GO后来实在写不下去了
SELECT aa.雨站 ,
( az雨量 + bz雨量 + cz雨量 ) / 3 ,
( ap雨量 + bp雨量 + cp雨量 ) / 3
FROM ( SELECT 雨站 ,
SUM(雨量) AS az雨量 ,
AVG(雨量) AS ap雨量
FROM tb
WHERE 时间 BETWEEN 开始时间 AND 结束时间
GROUP BY 雨站
) aa
LEFT JOIN ( SELECT 雨站 ,
SUM(雨量) AS bz雨量 ,
AVG(雨量) AS bp雨量
FROM tb
WHERE 时间 BETWEEN DATEADD(yy, 1, 开始时间) AND DATEADD(yy, 1,
结束时间)
GROUP BY 雨站
) bb ON aa.雨站 = bb.雨站
LEFT JOIN ( SELECT 雨站 ,
SUM(雨量) AS cz雨量 ,
AVG(雨量) AS cp雨量
FROM tb
WHERE 时间 BETWEEN DATEADD(yy, -1, 开始时间) AND DATEADD(yy,
-1, 结束时间)
GROUP BY 雨站
) cc ON aa.雨站 = cc.雨站
SELECT aa.雨量站 ,
( az雨量 + bz雨量 + cz雨量 ) / 3 ,
( ap雨量 + bp雨量 + cp雨量 ) / 3
FROM ( SELECT 雨量站 ,
SUM(雨量) AS az雨量 ,
AVG(雨量) AS ap雨量
FROM 实测雨情表
WHERE 时间 BETWEEN '2011-03-06 8:00:00' AND '2011-03-16 8:00:00'
GROUP BY 雨量站
) aa
LEFT JOIN ( SELECT 雨量站 ,
SUM(雨量) AS bz雨量 ,
AVG(雨量) AS bp雨量
FROM 实测雨情表
WHERE 时间 BETWEEN DATEADD(yy, 1, '2011-03-06 8:00:00') AND DATEADD(yy, 1,
'2011-03-16 8:00:00')
GROUP BY 雨量站
) bb ON aa.雨量站 = bb.雨量站
LEFT JOIN ( SELECT 雨量站 ,
SUM(雨量) AS cz雨量 ,
AVG(雨量) AS cp雨量
FROM 实测雨情表
WHERE 时间 BETWEEN DATEADD(yy, -1, '2011-03-06 8:00:00') AND DATEADD(yy,
-1, '2011-03-16 8:00:00')
GROUP BY 雨量站
) cc ON aa.雨量站 = cc.雨量站
全是NULL值
2011-04-06 8:00:00 至 2011-04-08 8:00:00数据库中有三年数据,那么常年就是
XXXX-04-06 8:00:00 至 XXXX-04-08 8:00:00 (XXXX年该时段总和)
这里的三年是假设的,应该从数据中读取判断有几年然后各年各个时段的总和/年份个数
把上面的 都改成这样:
( isnull(az雨量,0) + isnull(bz雨量,0) + isnull(cz雨量,0) ) / 3
如果当年没有,前一年也没有,后一年还是没有 则为0。你说要看所有年的,确实还是用函数比较方便取出所在时间段的数据,然后按年分组求和,求个数 ,做商。
没一个雨站都要处理一遍,可以用游标,或是用自定义函数。你要的是所有存在的年,如果有
http://61.191.22.155/hq/DroughtAnalysis/P0301.aspx按照选定的日期,进行统计
declare @sdate datetime, @edate datetime
set @sdate = '2011-04-06 8:00:00'
set @edate = '2011-04-08 8:00:00'select 雨量站,常年=sum(雨量)/count(distinct year(时间))
from (
select * from #t where dateadd(yy,datediff(yy,时间,@sdate),时间) between @sdate and @edate
) a
group by 雨量站
(
雨量站,雨量,年份,时段
)
as
select [雨量站], [雨量], CONVERT(varchar(4),year([时间])),right(CONVERT(varchar(20),[时间],20),14)
FROM [实测雨情表];CREATE FUNCTION Rain_F1
(@bdt varchar(20),
@edt varchar(20))
RETURNS TABLE
AS
BEGIN
RETURN
( select [雨量站],[年份],sum([雨量]) [雨量] from Rain_V1
where 时段 between @bdt and @edt
group by [雨量站],[年份]
);
END
GOCREATE FUNCTION Rain_F2 (@bdt varchar(20),
@edt varchar(20))
RETURNS TABLE
AS
RETURN
(
select [雨量站],[年份],sum([雨量]) [雨量] from Rain_V1
where 时段 between @bdt and @edt
group by [雨量站],[年份]
);
GO