2

开发中的项目是具有以下订阅级别的业务目录:白金、黄金、白银和青铜

我有 3 张桌子与此任务有关。我将把重要的列放在括号中。

BD_Listing(ListingID、LevelID、Active)

  • 列表ID、INT、PK
  • LevelID,INT 4=青铜,5=银,6=金,7=铂
  • 活跃,比特

BD_ListingOwner(用户 ID、列表 ID)

  • UserID(这是经过身份验证的用户的 UserID)
  • ListingID(当初始列表创建时,他们的 UserID 和 ListingID 被输入到这个表中。

BD_Storefront(RecurringSubscriptionID、数量、VariantID、状态)

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

购买后,用户会被带到一个页面,在那里他们可以开始创建他们的列表。该页面上有一个看起来像表格的模块:

Level---------Active/Remaining----------动作

白金版--------1/0-----------------购买附加许可证

黄金-----------0/2------------------创建黄金上市

银牌----------0/0------------------购买附加许可证

青铜--------0/0------------------购买附加许可证

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

  1. 检查 BD_Storefront 表以​​查看有多少活动列表附加到登录人员的@passedUserID,并了解他们拥有的白金、黄金、白银和青铜的可用数量。
  2. 检查 BD_ListingOwner 表以获取附加到 @passedUserID 的列表数量
  3. 检查与 BD_ListingOwner 表相关的 BD_Listing 表以查看 LevelID 以了解实际创建了哪些级别类型,请记住这些整数与 BD_Storefront 表中的整数略有不同。

我需要确保获得每种类型的总数量,记住 John 可能在一个订单中购买 2 个黄金,在 BD_Storefront 表中显示 Quantity 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 中减去该数量以获得允许的剩余数量。

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

非常感谢。

4

1 回答 1

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

于 2013-01-29T03:19:55.900 回答