当前位置: 代码迷 >> 其他数据库 >> 一个有关问题-SQL Server2005 按月份统计商品价格
  详细解决方案

一个有关问题-SQL Server2005 按月份统计商品价格

热度:9767   发布时间:2013-02-26 00:00:00.0
请教高手一个问题--SQL Server2005 按月份统计商品价格
有张价格表:
自增ID, 商品ID, 价格录入时间, 价格(人民币)
ID_bigint ProductKeyID_nvarchar CreateTime_datetime StandardRMB_money
1 A000000001 2008-10-11 12:30:00 6.83
2 A000000002 2008-10-12 12:31:00 1.83
3 A000000007 2008-10-15 12:33:00 2.44
4 A000000004 2008-10-17 18:30:00 5.50
5 A000000008 2008-11-20 08:30:00 2.02
6 A000000001 2008-12-11 17:02:00 100.03
7 A000000002 2008-10-11 19:55:00 1025.83
8 A000000003 2009-01-08 16:25:00 25.83
9 A000000003 2009-02-18 12:55:00 24.80
10 A000000003 2009-07-05 11:05:00 20.99
...
...

记录数有100多万数据。

现在要查的数据是
我指定 一个时间段 例如: 2008-12-21 到2009-7-01 
要查这个时间段内的产品价格。
如果没有价格则按照以前的价格计算。例如:A000000008 它的价格应该是 2008年11月20号的价格.
如果这个时间段有多个价格的话,求平均值。例如:A000000003 它的价格就应该是(25.83+24.80)/2




------解决方案--------------------------------------------------------

------解决方案--------------------------------------------------------
分两步: 
select ProductKeyID,avg(StandardRMB) from tt group by ProductKeyID 
where convert(char(10), CreateTime,120) between '2008-12-21' and '2009-7-01'

select a.* from tt inner join
(select ProductKeyID,max(CreateTime) as ma
 where convert(char(10), CreateTime,120)<'2008-12-21'
group by ProductKeyID) on 
a.ProductKeyID=b.ProductKeyID and a.CreateTime=b.ma

将两个结果连接,如果结果1中已经有的ProductKeyID,结果2中就应该去掉
------解决方案--------------------------------------------------------
select ProductKeyID,avg(StandardRMB) from tt group by ProductKeyID 
GROUP BY ProductKeyID
where convert(char(10), CreateTime,120) between '2008-12-21' and '2009-7-01' 
UNION ALL
SELECT * FROM (
select a.* from tt A inner join 
(select ProductKeyID,max(CreateTime) as ma 
where convert(char(10), CreateTime,120) <'2008-12-21' 
group by ProductKeyID) B on 
a.ProductKeyID=b.ProductKeyID and a.CreateTime=b.ma) C
WHERE ProductKeyID NOT IN
(select ProductKeyID from tt
where convert(char(10), CreateTime,120) between '2008-12-21' and '2009-7-01' )
------解决方案--------------------------------------------------------
不过我的创建时间本来就是日期格式的不用Convert可以吗?
你的是日期时间型,要取所月日要转换一下

还有分两步其实一步可以实现吧:
不是,因为你要求
如果在日期中,则平均
否则,取<指定日期的记录中最大日期对应的StandardRMB
  相关解决方案