[SQL]如何计算有效的VIP号码。每个月?

时间:2017-03-29 04:16:46

标签: sql

我想计算有效的VIP号码。每月。 有vip_card_no,create_date,expire_date

的VIP表

结果集应该是这样的:

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;

我已经花了一整天,我希望有人能帮助我! 谢谢你!

1 个答案:

答案 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

<强>输出

enter image description here