代码之家  ›  专栏  ›  技术社区  ›  dave

哪些SQL查询将有助于分析成员库?

  •  0
  • dave  · 技术社区  · 16 年前

    在我们的体育中心,我想分析会员的订阅数量和类型,但我在准确的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. 一天有多少活跃的会员

    对于(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)
    

    然而,它似乎没有产生正确的结果(基于我们对会员资格的理解和一些手工计算)。

    我还没有试过去工作。

    有什么关于我所追求的问题的建议吗?

    2 回复  |  直到 16 年前
        1
  •  0
  •   Andrew Lygin    16 年前

    目前有多少会员持有有效的“健身房”通行证

    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
    
        2
  •  1
  •   OMG Ponies    16 年前

    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.第2条。一天我有多少活跃的会员(即多少有效的通行证)

    用途:

    SELECT COUNT(*)
      FROM SUBSCRIPTIONS s
     WHERE @arbitrary_date BETWEEN s.startdate AND s.enddate