当前位置: 代码迷 >> Sql Server >> 想了很久,没有找到解决办法,帮小弟我计算一下产品周期,谢谢。
  详细解决方案

想了很久,没有找到解决办法,帮小弟我计算一下产品周期,谢谢。

热度:78   发布时间:2016-04-24 09:19:46.0
想了很久,没有找到解决方法,请教大家,帮我计算一下产品周期,多谢。。。
本帖最后由 aken815 于 2015-03-14 19:32:33 编辑
想了很久,没有找到解决方法,请教大家,帮我计算一下产品周期,多谢。。。
原始数据如下:
卡号 |    产品 |    动作 |    开始日期 |    结束日期
A001 |    A产品 |    开通 |    2014-01-01 |    2014-05-30
A001 |    A产品 |    续约 |    2014-06-01 |    2014-12-31
A001 |    A产品 |    取消 |    2014-06-01 |    2014-12-31
A001 |    A产品 |    重开 |    2014-06-08 |    2015-01-07
A001 |    A产品 |    续约 |    2015-01-08 |    2015-06-07

A002 |    B产品 |    开通 |    2014-01-01 |    2014-05-30
A002 |    B产品 |    续约 |    2014-06-01 |    2014-12-31
A002 |    B产品 |    续约 |    2015-01-01 |    2015-05-30

计算成以下数据:
卡号 |    产品 |    动作 |    开始日期 |    结束日期 |    产品周期
A001 |    A产品 |    开通 |    2014-01-01 |    2014-05-30 |     1
A001 |    A产品 |    续约 |    2014-06-01 |    2014-12-31 |     2
A001 |    A产品 |    取消 |    2014-06-01 |    2014-12-31 |     0
A001 |    A产品 |    重开 |    2014-06-08 |    2015-01-07 |     1
A001 |    A产品 |    续约 |    2015-01-08 |    2015-06-07 |     2

A002 |    B产品 |    开通 |    2014-01-01 |    2014-05-30 |     1
A002 |    B产品 |    续约 |    2014-06-01 |    2014-12-31 |     2
A002 |    B产品 |    续约 |    2015-01-01 |    2015-05-30 |     3

需要计算一下产品周期,计算方法是这样的,开通算1,续约加1,取消归0,取消后产品周期从1重新计算。
多谢大家。。。。。
------解决思路----------------------

create table mytable(
卡号 varchar(5) ,产品 varchar(10) ,动作 varchar(10) ,开始日期 varchar(10) ,结束日期 varchar(10)
)
go
insert into mytable values
('A001','A产品','开通','2014-01-01','2014-05-30'),
('A001','A产品','续约','2014-06-01','2014-12-31'),
('A001','A产品','取消','2014-06-01','2014-12-31'),
('A001','A产品','重开','2014-06-08','2015-01-07'),
('A001','A产品','续约','2015-01-08','2015-06-07'),
('A002','B产品','开通','2014-01-01','2014-05-30'),
('A002','B产品','续约','2014-06-01','2014-12-31'),
('A002','B产品','续约','2015-01-01','2015-05-30')
go
with myrn as (
select * ,ROW_NUMBER() over(partition by 卡号 order by 卡号) as rn from mytable
) , 
mt as (
select * , 1 as 产品周期 from myrn where rn = 1 
union all
select myrn.* , case when myrn.动作 = '续约' then mt.产品周期 + 1 
                     when myrn.动作 = '取消' then 0 
                     when myrn.动作 = '重开' then 1 
                end 
from mt , myrn where myrn.rn = mt.rn + 1 and mt.卡号 = myrn.卡号
)
select * from mt order by 卡号 , rn 
go
drop table mytable 
go

(8 行受影响)
卡号    产品     动作       开始日期   结束日期   rn  产品周期
----- ---------- ---------- ---------- ---------- --- -----------
A001  A产品      开通       2014-01-01 2014-05-30 1   1
A001  A产品      续约       2014-06-01 2014-12-31 2   2
A001  A产品      取消       2014-06-01 2014-12-31 3   0
A001  A产品      重开       2014-06-08 2015-01-07 4   1
A001  A产品      续约       2015-01-08 2015-06-07 5   2
A002  B产品      开通       2014-01-01 2014-05-30 1   1
A002  B产品      续约       2014-06-01 2014-12-31 2   2
A002  B产品      续约       2015-01-01 2015-05-30 3   3

(8 行受影响)


  相关解决方案