在我们的体育中心,我想分析一下我们的会员订阅的数量和类型,但我遇到了确切的SQL查询问题。
“订阅”是一个入场通行证,可让您进入我们体育中心的特定活动。它们有一个开始和结束日期,代表它们有效的时间段。他们有相关的活动(例如“健身房”,“游泳”,“团体健身”,“攀岩”等)。
会员可以拥有多个订阅。通常,一个人在购买下一个之前会过期,但他们可以有两个(或更多)有效(或当前)订阅。
简化一点,我们有以下两个表:
Members - stores a member's data, has these columns ID (int) - unique ID for a member Name (varchar) - the member's name Gender (varchar) - the member's gender NumGym (int) - number of valid gym passes a member has (derived)
和
Subscriptions - holds all the subscriptions we've sold, has these columns TypeID (varchar) - unique ID for a subscription type (specifies activity) MemberID (int) - the ID of the member that purchased this subscription StartDate (datetime) - when the subscription is valid from EndDate (datetime) - when the subscription is valid to
我希望能够提出的一些问题是:
对于(1),我尝试了以下内容:
declare @aDay datetime
set @aDay = convert(datetime, '2009-12-08', 102)
update Members m
set NumGym = (select count(memberid)
from Subscriptions s
where s.MemberId = m.Id
and s.TypeID = "Gym"
and @aDay between s.StartDate and s.EndDate)
然而,它似乎没有产生正确的结果(基于我们对会员资格的理解和一些人工计数)。
未能(1)工作,我还没有尝试过(2)。
有关查询的任何建议,以产生我所追求的内容吗?
答案 0 :(得分:1)
使用:
SELECT COUNT(*)
FROM SUBSCRIPTIONS s
WHERE GETDATE() BETWEEN s.startdate AND s.enddate
AND s.typeid = 'Gym'
GETDATE() is a SQL Server function您可以致电获取当前日期(和时间),而不是构建日期。
使用:
SELECT COUNT(*)
FROM SUBSCRIPTIONS s
WHERE @arbitrary_date BETWEEN s.startdate AND s.enddate
答案 1 :(得分:0)
目前有多少成员拥有有效的“健身房”通行证
SELECT COUNT(*)
FROM Subscriptions
WHERE CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME) BETWEEN StartDate AND EndDate
AND TypeID = 'Gym'
您应该在此处截断GETDATE()
,因为您希望按照我的理解包含EndDate
。
“有多少会员?”与“通过多少次?”不一样。
所以“有多少成员?”:
SELECT COUNT(DISTINCT MemberID)
FROM Subscriptions
WHERE @Date BETWEEN StartDate AND EndDate
和“通过多少次?”:
SELECT COUNT(*)
FROM Subscriptions
WHERE @Date BETWEEN StartDate AND EndDate