有表 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应如何实现呢? 非常感谢!
字段: 时间,类型,数值, 均为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应如何实现呢? 非常感谢!
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)
您好! 我的类型里的AAA和BBB就是个示意,实际上是文字的……如果不用比较的咋做啊?
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]