数据库有一个表tabtime,3个字段,
station(地区代码)例如501,502......
time(时间年月日)例如2009031301指09年3月13日1点
temp160(数据)例如4表内有类似数据
station time temp160
501 2009031306 4----------13号6点该地区的值是4
501 2009031307 6----------13号7点该地区的值是6
501 2009031308 8----------13号8点该地区的值是8
502 2009031306 3----------13号6点该地区的值是3
502 2009031307 4----------13号7点该地区的值是4
502 2009031308 3----------13号8点该地区的值是3以上数据只是3月13日的,表中每天每小时都会有一条数据录入
现在需要求出每个地区5天内,每天24小时temp160的平均值,并且已表格的形式显示在网页上
例如今天13号,就求13号和之前4天的数据平均值
格式如下地区 13日 12日 11日 10日 9日501 7 6 6 5 3502 6 4 8 4 5
.
.
.
.
.
station(地区代码)例如501,502......
time(时间年月日)例如2009031301指09年3月13日1点
temp160(数据)例如4表内有类似数据
station time temp160
501 2009031306 4----------13号6点该地区的值是4
501 2009031307 6----------13号7点该地区的值是6
501 2009031308 8----------13号8点该地区的值是8
502 2009031306 3----------13号6点该地区的值是3
502 2009031307 4----------13号7点该地区的值是4
502 2009031308 3----------13号8点该地区的值是3以上数据只是3月13日的,表中每天每小时都会有一条数据录入
现在需要求出每个地区5天内,每天24小时temp160的平均值,并且已表格的形式显示在网页上
例如今天13号,就求13号和之前4天的数据平均值
格式如下地区 13日 12日 11日 10日 9日501 7 6 6 5 3502 6 4 8 4 5
.
.
.
.
.
*
FROM (
SELECT Station,time160,DATEDIFF(day,[time],GETDATE()) AS diff
FROM tb
WHERE DATEDIFF(day,[time],GETDATE())<5
) AS A
PIVOT(
AVG(time160) FOR diff IN([0],[1],[2],[3],[4])
) AS pvt
SET @sql=''DECLARE @dt DATETIME;
SET @dt=GETDATE();WHILE DATEDIFF(day,dt,GETDATE())<5
BEGIN
SET @sql=@sql+',AVG(CASE WHEN day(time)='+RTRIM(DAY(@dt))+' THEN temp160 ELSE 0 END) AS ['+RTRIM(DAY(@dt))+'日]';
SET @dt=DATEADD(day,-1,@dt);
ENDEXEC('
SELECT
station'+@sql+'
FROM tb
WHERE DATEDIFF(day,time,GETDATE())<5
GROUP BY station
')
-- Author: liangCK 小梁
---------------------------------
--> 生成测试数据: #tb
IF OBJECT_ID('tempdb.dbo.#tb') IS NOT NULL DROP TABLE #tb
CREATE TABLE #tb (station INT,time DATETIME,temp160 INT)
INSERT INTO #tb
SELECT 501,'20090313 06:00:00',4 UNION ALL
SELECT 501,'20090313 07:00:00',6 UNION ALL
SELECT 501,'20090313 08:00:00',8 UNION ALL
SELECT 502,'20090313 06:00:00',3 UNION ALL
SELECT 502,'20090313 07:00:00',4 UNION ALL
SELECT 502,'20090313 08:00:00',3 UNION ALL
SELECT 502,'20090312 08:00:00',3
--SQL查询如下:DECLARE @sql VARCHAR(8000);
SET @sql=''DECLARE @dt DATETIME;
SET @dt=GETDATE();WHILE DATEDIFF(day,@dt,GETDATE())<5
BEGIN
SET @sql=@sql+',AVG(CASE WHEN day(time)='+RTRIM(DAY(@dt))+' THEN temp160 ELSE 0 END*1.) AS ['+RTRIM(DAY(@dt))+'日]';
SET @dt=DATEADD(day,-1,@dt);
ENDEXEC('
SELECT
station'+@sql+'
FROM #tb
WHERE DATEDIFF(day,time,GETDATE())<5
GROUP BY station
')
/*
station 13日 12日 11日 10日 9日
----------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
501 6.000000 0.000000 0.000000 0.000000 0.000000
502 2.500000 0.750000 0.000000 0.000000 0.000000(2 行受影响)*/
declare @tb table (station int,[time] nvarchar(15),temp160 int)
insert into @tb select 501,'2009031306',4
union all select 501,'2009031307',6
union all select 501,'2009031308',8
union all select 502,'2009031306',3
union all select 502,'2009031307',4
union all select 502,'2009031308',3
select * from (select station,temp160,SUBSTRING([time],7,2) as [day] from @tb) a
pivot (avg (temp160) for [day] in ([13],[12],[11],[10],[9])) b
station 13 12 11 10 9
----------- ----------- ----------- ----------- ----------- -----------
501 6 NULL NULL NULL NULL
502 3 NULL NULL NULL NULL(2 行受影响)
写成存储过程,在asp使用ado调用存储过程会吧?
create table #1 (station nvarchar(10), time nvarchar(10), temp160 int )insert #1 values('501', '2009031306', 4)----------13号6点该地区的值是4
insert #1 values('501', '2009031307', 6)----------13号7点该地区的值是6
insert #1 values('501', '2009031308', 8)----------13号8点该地区的值是8
insert #1 values('502', '2009031306', 3)----------13号6点该地区的值是3
insert #1 values('502', '2009031307', 4)----------13号7点该地区的值是4
insert #1 values('502', '2009031308', 3)----------13号8点该地区的值是3 declare @sql varchar(max)
set @sql = '
select * from
(
select station,temp160,日期=datepart(dd,left(time,8)) from #1 where datediff(dd,left(time,8),getdate()) <= 5
)a pivot ( avg (temp160) for 日期 in('
set @sql = @sql +'['+rtrim(datepart(dd,getdate()))+'],['+rtrim(datepart(dd,datediff(dd,1,getdate())))+'],['+rtrim(datepart(dd,datediff(dd,2,getdate())))+'],['+rtrim(datepart(dd,datediff(dd,3,getdate())))+'],['+rtrim(datepart(dd,datediff(dd,4,getdate())))+'])) b'
--print @sql
exec(@sql)
/*station 13 12 11 10 9
---------- ----------- ----------- ----------- ----------- -----------
501 6 NULL NULL NULL NULL
502 3 NULL NULL NULL NULL(2 row(s) affected)
*/
填充记录集
然后帮定数据源
如果是SQL查询,用上面的语句.如果是问ASP显示,去ASP版问.