私は購買情報を抽出したいメンバーシップデータベースを持っていますが、SQLで最も良い方法はわかりません。私たちは定期購読を販売しています。定期購読は一定期間、ジムへの入場券です。 3ヶ月。メンバーはそれらを購入し、期限が切れると別のメンバーを買うかもしれません。メンバーのグループを選択したいと思います。しばらく前に3か月のパスを購入した学生は、次回の購読購入があった場合はそれを決定します。SQLでの購入クエリをフォローアップ
関与(関連列を持つ)の3つのテーブルがあります
- SubscriptionTypesが(ID、説明、期間は) - サブスクリプションが
- サブスクリプションを購入することができるかを定義(MEMBERID、SubTypeID、開始日、終了日) - 購入のインスタンスは、彼らは時間をかけて購入したサブスクリプションの種類とメンバーをリンク
- メンバー(ID、タイプ) - メンバデータ、タイプすることができ学生、標準、年金受給者
は、だから私は去年一年のこの時点で3ヶ月のサブスクリプションを購入メンバーのIDを決定したい場合は、私のようなもの使用することができます
SELECT MemberID, StartDate, EndDate
FROM Subscriptions s
INNER JOIN Members m
ON s.MemberID = m.ID
INNER JOIN SubscriptionTypes st
ON s.SubTypeID = st.ID
WHERE s.StartDate BETWEEN <period start> and <period end>
AND m.Type = 'Student'
AND st.Duration = 3
をこれが私のメンバーのセット(となります彼らが昨年買ったパスの実際の開始日と終了日)。
しかし、どのようにしてこの出発点から始めて、3ヶ月の有効期限が切れた後の期間(たとえば1ヶ月)にこれらのメンバーの次回の購読購入を抽出しますか?私は手続きメソッドを思い付くことができます。上のセットの各メンバーを繰り返し実行してクエリを実行しますが、これはSQLの方法ではありません。
誰か私にある方向を教えてもらえますか?私は元のセット、彼らの最初の購読予約情報とその2番目の(もしあれば)メンバーのセットで終了したいと思います。
あなたの答えをありがとう。 2つの質問:(a)1行目のn.MemberIDを参照してください。それはm.MemberIDですか? (b)あなたは "a"という2つの列を参照します。接頭辞として "a"はどこに定義されていますか? (c)これは、3ヶ月間のパスを購入する学生は除外しますが、それ以外は何もしません。 2回目の購入者を選択するだけですか? – dave
)はい、編集しました。 b)内部クエリ(私はそれにエイリアスを作った)c)はい、2番目を作ったものだけを選択します。内側のクエリ(エイリアスa)は、パスを購入したメンバを選択し、外側のクエリは、他のメンバを購入したメンバから選択します。 –