有表 test
字段: 时间,类型,数值, 均为varchar型 。数据为:
时间 类型 数值
2011-1-1 1:00:00   AAA    5
2011-1-1 1:00:00   BBB    4
2011-1-1 5:00:00   AAA    7
2011-1-1 5:00:00   BBB    5
2011-1-1 9:00:00   AAA    6.5
2011-1-1 9:00:00   BBB    6.52011-1-2 1:00:00   AAA    5
2011-1-2 1:00:00   BBB    4
2011-1-2 5:00:00   AAA    7
2011-1-2 5:00:00   BBB    5
2011-1-2 9:00:00   AAA    6.5
2011-1-2 9:00:00   BBB    6.5
2011-1-2 10:00:00   AAA    6.5
2011-1-2 10:00:00   BBB    6.5
需要SQL来计算,计算的方法是:每个时间的数据A*B得出结果,一天的数据将这个结果平均值*24,然后再将所有日期的值相加
此处计算为:(5*4+7*5+6.5*6.5)/3*24 + :(5*4+7*5+6.5*6.5+6.5*6.5)/4*24 
执行后得出结果
就是可以按照1月1号的,将A*B计算完,求平均*24,再计算1月2号的,之后再相加。
这种SQL应如何实现呢? 非常感谢!

解决方案 »

  1.   

    --> 测试数据: #tb
    if object_id('tempdb.dbo.#tb') is not null drop table #tb
    go 
    create table #tb (时间 datetime,类型 varchar(3),数值 numeric(2,1))
    insert into #tb
    select '2011-1-1 1:00:00','AAA',5 union all
    select '2011-1-1 1:00:00','BBB',4 union all
    select '2011-1-1 5:00:00','AAA',7 union all
    select '2011-1-1 5:00:00','BBB',5 union all
    select '2011-1-1 9:00:00','AAA',6.5 union all
    select '2011-1-1 9:00:00','BBB',6.5 union all
    select '2011-1-2 1:00:00','AAA',5 union all
    select '2011-1-2 1:00:00','BBB',4 union all
    select '2011-1-2 5:00:00','AAA',7 union all
    select '2011-1-2 5:00:00','BBB',5 union all
    select '2011-1-2 9:00:00','AAA',6.5 union all
    select '2011-1-2 9:00:00','BBB',6.5 union all
    select '2011-1-2 10:00:00','AAA',6.5 union all
    select '2011-1-2 10:00:00','BBB',6.5select cast(SUM(n) as decimal(18,1)) as n
    from 
    (
        select convert(varchar(10),a.时间,120) as sj,avg(a.数值*b.数值) *24 as n
        from #tb a,#tb b
        where a.类型>b.类型 and  convert(varchar(10),a.时间,120)= convert(varchar(10),b.时间,120)
        group by  convert(varchar(10),a.时间,120)
    )t
    n
    ---------------------------------------
    1589.7(1 row(s) affected)
      

  2.   


    您好! 我的类型里的AAA和BBB就是个示意,实际上是文字的……如果不用比较的咋做啊?
      

  3.   

    再就是n为什么总报错啊?我之前那个帖子也是n报错的。不好意思,我不太懂SQL,只是程序要用。
      

  4.   

    [code=SQ]select cast(SUM(n) as decimal(18,1)) as n
    from 
    (
        select convert(varchar(10),a.时间,120) as sj,avg(a.数值*b.数值) *24 as n
        from #tb a,#tb b
        where a.时间<b.时间 and  convert(varchar(10),a.时间,120)= convert(varchar(10),b.时间,120)
        group by  convert(varchar(10),a.时间,120)
    )t[/code]