导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

求一个SQL语句, 不知道该怎么写

bizshow 2007-12-29 04:35:59
假设有如下两个表,表一是销售记录, 表二是所有商品

表一:
商品名称 购买数量 购买时间
--------------------------------------------------------------
麻花 10 2006-07-21 00:00:00
棉花糖 1 2007-01-21 00:00:00
小花片 2 2007-02-21 00:00:00
白菜 21 2007-03-21 00:00:00
麻花 20 2007-04-21 00:00:00
棉花糖 18 2007-05-21 00:00:00
小花片 23 2007-06-21 00:00:00
白菜 29 2007-07-21 00:00:00
麻花 102 2007-08-21 00:00:00
棉花糖 13 2007-09-21 00:00:00
小花片 29 2007-10-21 00:00:00
白菜 45 2007-11-21 00:00:00

表二:
商品名称 最近365天销售数量
-------------------------------------------------------------
麻花 122
棉花糖 24
小花片 54
白菜 95

我要怎么做才能从表一中查出今天往前推365天(也就是最近一年)的销售量并更新表二?

本来我是想靠编程, 根据表二一条一条查询表一再来更新, 可是这样效率太低了.
请高人指教~谢谢各位达人...
...全文
165 点赞 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tim_spac 2008-01-02

truncate table [表二]
insert into [表二]
select
[商品名称],
[最近365天销售数量] = sum([购买数量])
from [表一]
where [购买时间] >= getdate()-365
group by
[商品名称]

回复
paranoid_luo 2008-01-02
update 表二 b
set 最近365天销售数量=
(select sum(购买数量)
from
表一 where 商品名称=b.商品名称 and 购买时间>=dateadd(day,-365,getdate()) and 购买时间<getdate())
回复
tim_spac 2007-12-31
好像还得删除近365天内都没数据的相关条目
干脆先trunk掉表数据,然后再将所有的汇总数据直接insert 进来。
回复
tim_spac 2007-12-31
这种情况建议第一步先更新现有数据
再将不存在的数据insert into..
回复
duoluohuifeng 2007-12-31

update 表二 set
最近365天销售数量=A.购买数量
FROM 表二
join
(SELECT A.商品名称,SUM(B.购买数量) AS 购买数量
from
(select 商品名称,MAX( 购买时间) AS 购买时间
from 表一 A) A
JOIN 表一 B ON A.商品名称=B.商品名称 AND datediff(day , A.购买时间 , B.购买时间) <= 365) A

on 表二.商品名称=A.商品名称
回复
bizshow 2007-12-30
晕,回帖把我的回车给吃掉了, 上面的回帖是 文字对应 文字之上的那条sql语句.
回复
bizshow 2007-12-30
update 表二
set 最近365天销售数量 = n.购买数量
from 表二 m , (select 商品名称 , 购买数量 = sum(购买数量) from 表一 where datediff(day , 购买时间 , getdate()) <= 365 group by 商品名称) n
where m.商品名称 = n.商品名称

按照这个方法, 如果有个商品最近一年都没有卖出一个, 那么他的最近一年销量就没有更新, 仍然是去年的啊.....

update 表二 set 最近365天销售数量=(select sum(购买数量) from 表一 where 商品名称=b.商品名称 and 购买时间>=dateadd(day,-365,getdate()) and 购买时间<getdate())
from 表二 a

这个有错误, 说是b什么什么的忘记了...

select * into #temp from (select 商品名称,sum(购买数量)总数量 from  表一 where 
datediff(dd,b.购买时间,getdate())<=365 group by 商品名称)a

update 表二 set 最近365天销售数量=b.总数量 from 表二 a,#temp b
where a.商品名称=b.商品名称

这个用到临时表, 比较影响性能, 所以不采用了, 不过还是谢谢你.
回复
qiule 2007-12-29
update 表二
set 最近365天销售数量 = n.购买数量
from 表二 m , (select 商品名称 , 购买数量 = sum(购买数量) from 表一 where datediff(day , 购买时间 , getdate()) <= 365 group by 商品名称) n
where m.商品名称 = n.商品名称
回复

--不用临时表
update 表二 set 最近365天销售数量=(select sum(购买数量) from 表一 where 商品名称=b.商品名称 and 购买时间>=dateadd(day,-365,getdate()) and 购买时间<getdate())
from 表二 a
回复
dawugui 2007-12-29
update 表二
set 最近365天销售数量 = n.购买数量
from 表二 m , (select 商品名称 , 购买数量 = sum(购买数量) from 表一 where datediff(day , 购买时间 , getdate()) <= 365 group by 商品名称) n
where m.商品名称 = n.商品名称
回复
JL99000 2007-12-29
我的想法啊:
第一:首先初始的时候应该有一条记录,记录表二每种产品的一条记录,另外我想加一个字段,就是365天的最开始的那天(日期)
这样,当到了新的一天,你可以从表一中取出新的一天的购买数量,更新表一中的数据,包括修改365天的最开始的那天为当前的日期
然后将最近365天销售数量更新,用当前数量+当前日期的数量-365天的最开始的那天(日期)
有点事
先不说了
这个应该能解决
回复
pt1314917 2007-12-29

select * into #temp from (select 商品名称,sum(购买数量)总数量 from 表一 where
datediff(dd,b.购买时间,getdate())<=365 group by 商品名称)a

update 表二 set 最近365天销售数量=b.总数量 from 表二 a,#temp b
where a.商品名称=b.商品名称

回复
bizshow 2007-12-29
晕,怎么CSDN屏蔽了制表符.....
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告