我想计算有效的VIP号码。每月。
有vip_card_no,create_date,expire_date
结果集应该是这样的:
period | valid vip number
june2016 20
july2016 18
august2016 30
.....
march2017 40
april2017 30
(句点是用户选择的范围。例如,用户选择june2016到2017年4月)
应排除过期的贵宾卡。 例如,在20170321创建的贵宾卡,它将于2017年4月到期。 它将在2017年3月计算,但不计入2017年4月
问题是
1.我不知道如何分组,因为时间范围是变量
2.我试图编写一个累计查询,但我不知道如何消除过期数据。
类似的东西
select t1.date, COUNT(t2.vip_card_no) as AccumulateNoOfCases
FROM vip t1
join vip t2 on t2.date <=t1.date
group by t1.date;
我已经花了一整天,我希望有人能帮助我! 谢谢你!
答案 0 :(得分:1)
@Teris,您没有提供任何样本数据,如果没有适当的信息,很难解决任何问题。
我已尝试解决此问题,并且已根据您的说明创建了Table
。插入一些样本数据。我考虑过你的描述:
应排除过期的贵宾卡。例如,在20170321创建的贵宾卡,它将于2017年4月到期。它将在2017年3月计算,但不计入2017年4月。
我已根据 create_date 统计了VIP卡。请检查一下:
示例数据
Insert Into VIPTable Values('0000','02/15/2017','02/15/2018')
Insert Into VIPTable Values('1111','03/15/2017','03/15/2018')
Insert Into VIPTable Values('2222','03/16/2017','03/16/2018')
Insert Into VIPTable Values('3333','04/15/2017','04/15/2018')
Insert Into VIPTable Values('4444','04/15/2017','04/15/2018')
Insert Into VIPTable Values('5555','04/15/2017','04/15/2018')
Insert Into VIPTable Values('6666','05/15/2017','05/15/2018')
Insert Into VIPTable Values('7777','05/15/2017','05/15/2018')
Insert Into VIPTable Values('8888','06/15/2017','06/15/2018')
Insert Into VIPTable Values('9999','06/15/2017','06/15/2018')
<强> SQL 强>
Declare @periodStart DateTime, @periodEnd DateTime
Set @periodStart = '01/01/2017'
Set @periodEnd = '12/30/2017'
Select
Convert(Char(4), create_date, 100) + Convert(Char(4), create_date, 120) As Period,
Count(vip_card_no) As AccumulateNoOfCases
From VIPTable
Where create_date Between @periodStart And @periodEnd
Group By Convert(Char(4), create_date, 100) + Convert(Char(4), create_date, 120)
Order By AccumulateNoOfCases Desc
<强>输出强>