ProjectId Money User AddDate
1 200 1 2012-02-01
1 300 2 2012-02-01
1 400 1 2012-03-01
如何查询出这个项目这个项目的总收益?每个月份的收益,总共进行月份,以及当前是项目中的第几个月份?
比如 当月收益 总收益 实际月份 项目周期 项目周期中的月份
500 900 2012-02-01 2个月 1
400 900 2012-03-01 2个月 2
1 200 1 2012-02-01
1 300 2 2012-02-01
1 400 1 2012-03-01
如何查询出这个项目这个项目的总收益?每个月份的收益,总共进行月份,以及当前是项目中的第几个月份?
比如 当月收益 总收益 实际月份 项目周期 项目周期中的月份
500 900 2012-02-01 2个月 1
400 900 2012-03-01 2个月 2
select 当月收益, 总收益, 实际月份, 项目周期,datediff(mm,(select top (1) 实际月份 from tb where ProjectId = a.ProjectId order by 实际月份),实际月份)+1 as 项目周期中的月份 from tb
然后悲剧了,出来了2个ProjectId,跟Project联合的时候出现笛卡尔积了- -
create table #tb(ProjectId int, Money int, [User] int, AddDate varchar(10))
insert into #tb
select 1, 200, 1, '2012-02-01'
union all select 1, 300, 2, '2012-02-01'
union all select 1, 400, 1, '2012-03-01'
--解决方案
select ProjectId, sum(Money)当月收益,sum(sum(Money))over(partition by ProjectId )总收益,
AddDate 实际月份,cast(datediff(mm,min(AddDate)over(),max(AddDate)over())+1 as varchar(10)) +'个月' 项目周期中的月份,
datediff(mm,min(AddDate)over(),AddDate)+1 as 项目周期中的月份 from #tb group by ProjectId,AddDate
/*ProjectId 当月收益 总收益 实际月份 项目周期中的月份 项目周期中的月份
----------- ----------- ----------- ---------- -------------- -----------
1 500 900 2012-02-01 2个月 1
1 400 900 2012-03-01 2个月 2(2 行受影响)
*/整个帮你重写了