累加问题

jiemo587 2011-07-15 02:04:51
描述:数据库中有大批量顾客(上百万)customer表,有的顾客预约活动,以SKU的方式存在sales_order_item表中,如茶会活动的SKU为S201,其中一条记录可以多次预约,字段为item_num,customer关联sales_order_item关联sales_order通过userid,sales_order为顾客的销售,有购买时间。
顾客可以完成活动,SKU为S301;可以取消活动,SKU为S401.现在我想得到的结果是顾客剩余的预约次数(预约次数的的item_num总和-完成活动item_num总和-取消活动item_num总和),这个会。
还有就是顾客还剩余预约的最早购买时间,完成或者取消活动按照时间的排序将预约前N次抵扣,剩下来的预约的最早的购买时间就是我要的结果,这个我不知道用较简单方式做。
例如:1.顾客在2011-01-01预约3次,2011-02-01预约2次,2011-03-01预约1次,已经完成或者取消活动次数为4次,所以顾客剩余的预约次数为2,最早的购买时间为2011-02-01.
2.顾客在2011-01-01预约1次,2011-02-01预约5次,2011-03-01预约1次,已经完成或者取消活动次数为6次,所以顾客剩余的预约次数为1,最早的购买时间为2011-03-01.

求高手帮忙解决~如果是游标的方式会不会太慢?


...全文
80 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiemo587 2011-07-22
  • 打赏
  • 举报
回复
最后自己还是写游标将数据求出来,简单的方法木有找到,结贴
cd731107 2011-07-15
  • 打赏
  • 举报
回复

--name 顾客名称 date 预约时间,cl 预约次数
create table #tb(name varchar(8),date datetime,cl int)
insert #tb
select '张三','2011-01-01', 3 union all
select '张三','2011-02-01', 2 union all
select '张三','2011-03-01', 1 union all
select '李四','2011-01-01', 1 union all
select '李四','2011-02-01', 5 union all
select '李四','2011-03-01', 1
--name 顾客名称 ,cl 完成次数
create table #ta(name varchar(8),cl int)
insert #ta
select '张三',4 union all
select '李四',6


select b.* from #tb b,#ta a
where b.name=a.name
and (select sum(cl) from #tb c where c.name=a.name and c.date<=b.date)>a.cl
and (select sum(cl) from #tb c where c.name=a.name and c.date<b.date)<=a.cl

/*
name date cl
-------- ------------------------------------------------------ -----------
张三 2011-02-01 00:00:00.000 2
李四 2011-03-01 00:00:00.000 1

(所影响的行数为 2 行)
*/
X_0 2011-07-15
  • 打赏
  • 举报
回复

;with cte as
(
select t1.userid,t1.預約時間,
累計次數=(select sum(item_num) from sales_order_item t2
where t1.userid=t2.userid and t2.預約時間<=t1.預約時間),
取消完成次數=(select sum(item_num) from sales_order_item t3
where t1.userid=t3.userid
and t3.SKU in ('取消','完成'))
from sales_order_item t1
where SKU='預約'
)

select userid,最小預約時間=min(預約時間)
from cte
where 累計次數>取消完成次數
group by userid

X_0 2011-07-15
  • 打赏
  • 举报
回复


;with cte as
(
select t1.userid,t1.預約時間,
累計次數=(select sum(item_num) from sales_order_item t2
where t1.userid=t2.userid and t2.預約時間<=t1.預約時間),
取消完成次數=(select sum(item_num) from sales_order_item t3
where t1.userid=t2.userid
and SKU in ('取消','完成'))
from sales_order_item t1
where SKU='預約'
)

select userid,最小預約時間=min(預約時間)
from cte
where 累計次數>取消完成次數
group by userid
--小F-- 2011-07-15
  • 打赏
  • 举报
回复
分别用不同的字段记录不就可以查询了?
Happiness 2011-07-15
  • 打赏
  • 举报
回复
这种统计是不需要用游标的,SQL语句的优势就在这里
-晴天 2011-07-15
  • 打赏
  • 举报
回复
直接查询不行么,设置条件是预约未完成并且预约未取消.

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧