需要一个许可系统的SQL解决方案

时间:2013-01-17 01:25:14

标签: sql sql-server sql-server-2008-r2

开发中的项目是具有以下订阅级别的业务目录: 白金,金,银,铜牌

我有3个表对此任务有疑问。我将把重要的列放在括号中。

BD_Listing(ListingID,LevelID,Active)

  • ListingID,INT,PK
  • LevelID,INT 4 =青铜,5 =银,6 =金,7 =铂
  • Active,BIT

BD_ListingOwner(UserID,ListingID)

  • UserID(这是经过身份验证的用户的UserID)
  • ListingID(创建初始列表时,会在此表中输入其UserID和ListingID。

BD_Storefront(RecurringSubscriptionID,Quantity,VariantID,Status)

  • RecurringSubscriptionID PK
  • 数量(如果他们选择Gold,例如,他们可以为该级别选择多个许可证)
  • VariantID(与BD_Listing表略有不同.1 =青铜,2 =银,3 =金,4 =白金)
  • 状态(真或假)

购买后,用户将进入可以开始创建商家信息的页面。该页面上有一个看起来像桌子的模块:

等级----------主动/剩余----------操作

Platinum ------ 1/0 ------------------------------购买附加许可证

黄金----------- 0/2 ------------------------------创造黄金清单

Silver ---------- 0/0 ------------------------------购买附加许可

青铜-------- 0/0 ------------------------------购买额外许可证

基本上,我需要了解执行以下操作的正确SQL查询:

  1. 检查BD_Storefront表,查看有多少活动列表附加到登录用户的@passedUserID,并了解他们对白金,金牌,银牌和铜牌的可用数量。
  2. 检查BD_ListingOwner表以获取附加到@passedUserID的列表数
  3. 检查与BD_ListingOwner表相关的BD_Listing表,以查看LevelID以了解实际创建了哪些级别类型,请记住这些整数与BD_Storefront表中的整数略有不同。
  4. 我需要确保获得每种类型的总数量,记住约翰可以在一个订单中购买2个黄金,在BD_Storefront表中显示数量2,一个月后可以购买另一个黄金,创建另一行在数量为1的表中,总共给出了3个许可证。

    这是我到目前为止提出的SQL:

    SELECT
     a.[RecurringSalesOrderID]
    ,a.[UserID]
    ,a.[PortalID]
    ,a.[ProductVariantID]
    ,a.[Quantity]
    ,a.[NextRecurringDate]
    ,a.[Status]
    ,a.[OriginalSalesOrderID]
    ,a.[CreateDate]
    ,a.[UpdateDate]
    ,b.[UserID]
    ,b.[ListingID] AS OwnerListingID
    ,c.[ListingID] AS ListingListingID
    ,c.[LevelID]
    ,(SELECT SUM(Quantity) FROM BD_Storefront WHERE (UserID = @passedUserID) AND (ProductVariantID = 1) AND (Status = 1)) AS ActiveBronze
    ,(SELECT SUM(Quantity) FROM BD_Storefront WHERE (UserID = @passedUserID) AND (ProductVariantID = 2) AND (Status = 1)) AS ActiveSilver
    ,(SELECT SUM(Quantity) FROM BD_Storefront WHERE (UserID = @passedUserID) AND (ProductVariantID = 3) AND (Status = 1)) AS ActiveGold
    ,(SELECT SUM(Quantity) FROM BD_Storefront WHERE (UserID = @passedUserID) AND (ProductVariantID = 4) AND (Status = 1)) AS ActivePlatinum
    ,(SELECT COUNT(ListingID) FROM BD_ListingOwner WHERE (UserID = @passedUserID)
    
    FROM [BD_Storefront] a
    JOIN [BD_ListingOwner] b
    ON a.[UserID] = b.[UserID]
    JOIN [BD_Listing] c
    ON b.[ListingID] = c.[ListingID]
    WHERE a.[UserID] = @passedUserID
    AND Status = 1
    

    正如您所看到的,我不太清楚如何分析BD_Listing表以了解特定用户已创建的每种类型的列表,并从上面的每个SUMS中减去该数量以获得剩余的允许值

    如果有人能帮助我,那将是非常棒的。

    非常感谢你。

1 个答案:

答案 0 :(得分:0)

你的问题并不完全清楚,但这是你在寻找什么?

SELECT lsum.UserID
      ,lsum.LevelID
      ,SUM(ISNULL(sf.Quantity,0)) Active
      ,lsum.ListingTotal-SUM(ISNULL(sf.Quantity,0)) Remaining
FROM
    (SELECT  lo.UserID
            ,l.LevelID-3 LevelID
            ,COUNT(l.Active) ListingTotal
     FROM [BD_Listing] l 
         INNER JOIN
         [BD_ListingOwner] lo ON lo.[ListingID] = l.[ListingID]
     WHERE l.Active=1
     GROUP BY lo.UserID
            ,l.LevelID) lsum
     LEFT JOIN 
     [BD_Storefront] sf ON sf.[UserID] = lsum.[UserID]
                           AND
                           sf.VariantID=lsum.LevelID
                           AND sf.Status = 1
GROUP BY lsum.UserID
         ,lsum.LevelID
         ,lsum.ListingTotal

请参阅此SqlFiddle