哪些SQL查询有助于分析成员资格?

时间:2009-12-08 04:22:05

标签: sql sql-server sql-server-2000

在我们的体育中心,我想分析一下我们的会员订阅的数量和类型,但我遇到了确切的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. 目前有多少会员拥有有效的“健身房”通行证?
  2. 我在某一天有多少活跃会员
  3. 对于(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)。

    有关查询的任何建议,以产生我所追求的内容吗?

2 个答案:

答案 0 :(得分:1)

1。目前有多少成员拥有有效的“健身房”通行证?

使用:

SELECT COUNT(*)
  FROM SUBSCRIPTIONS s
 WHERE GETDATE() BETWEEN s.startdate AND s.enddate
   AND s.typeid = 'Gym'

GETDATE() is a SQL Server function您可以致电获取当前日期(和时间),而不是构建日期。

2。我在某一天有多少活跃成员(即有效通行证数量)

使用:

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