2

開発中のプロジェクトは、次のサブスクリプション レベルのビジネス ディレクトリです: プラチナ、ゴールド、シルバー、ブロンズ

このタスクで問題となっているテーブルが 3 つあります。重要な列を括弧内に入れます。

BD_Listing (ListingID、LevelID、Active)

  • ListingID、INT、PK
  • LevelID、INT 4=ブロンズ、5=シルバー、6=ゴールド、7=プラチナ
  • アクティブ、ビット

BD_ListingOwner (ユーザーID、リストID)

  • UserID (認証されたユーザーの UserID です)
  • ListingID (最初のリストが作成されると、ユーザー ID と ListingID がこのテーブルに入力されます。

BD_Storefront (RecurringSubscriptionID、数量、VariantID、ステータス)

  • RecurringSubscriptionID PK
  • 数量 (たとえば、ゴールドを選択した場合、そのレベルに対して複数のライセンスを選択できます)
  • VariantID (BD_Listing テーブルとは若干異なります。1=ブロンズ、2=シルバー、3=ゴールド、4=プラチナ)
  • ステータス (True または False)

購入後、ユーザーはリストの作成を開始できるページに移動します。そのページには、表のようなモジュールがあります。

レベル---------アクティブ/残り----------アクション

プラチナ------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 テーブルにあるものとは少し異なることに注意してください。

ジョンが 1 回の注文で 2 つのゴールドを購入し、BD_Storefront テーブルに数量 2 が表示され、1 か月後に別のゴールドを購入して、テーブルに別の行を作成する可能性があることを念頭に置いて、各タイプの合計数量を確認する必要があります。数量 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 テーブルを分析して、特定のユーザーが既に作成した各タイプのリストの数を把握し、上記の各合計からその量を差し引いて、許可された残りを取得する方法がよくわかりません。

誰かが私を助けることができれば、それは信じられないほど素晴らしいでしょう.

どうもありがとう。

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 に答える