数据库有一个表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
 .
 .
 .
 .
 .

解决方案 »

  1.   

    SELECT
        *
    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
      

  2.   

    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) 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
    ')
      

  3.   

    ---------------------------------
    --  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 行受影响)*/
      

  4.   

    好像是我没说清楚~这个是asp+sql,然后显示在网页上的~是不是我问错地方了~
      

  5.   

    楼主问错地方了,这个问题应该去ASP.NET问的
      

  6.   


    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 行受影响)
      

  7.   


    写成存储过程,在asp使用ado调用存储过程会吧?
      

  8.   


    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)
    */
      

  9.   

    sql语句 见3楼
    填充记录集
    然后帮定数据源
      

  10.   

    我晕,直接用一楼的不就行了,2005就实现的行列转置pivot功能
      

  11.   


    如果是SQL查询,用上面的语句.如果是问ASP显示,去ASP版问.