2

テーブルがあります。カテゴリ、件名。

Category -> id, name, desc; 
Subject -> id, name, desc, category_id;

カテゴリごとに取得した科目数の組み合わせに対して割引を提供しています。例えば。

Category Table (id, name)
1, Language
2, Cultural
3, Music

Subject table (id, name, category_id)
1, English, 1
2, Tamil, 1
3, Bharatham, 2
4, Violin, 3
5, Keyboard, 3

生徒が英語、タミル語、ヴァイオリンの科目を履修している場合、組み合わせは 2 つの言語と 1 つの音楽です。同様に、多くの組み合わせを記録する必要があり、それぞれに異なる割引額があります。カテゴリ数と割引率を組み合わせたテーブルを作成するにはどうすればよいですか?

4

1 に答える 1

0

割引テーブルを作成してから使用するという 2 つの問題があります。2 つのテーブルを含む、ほぼ正規化されたアプローチをお勧めします。

create table Discounts (
    DiscountId int,
    DiscountRate float,
    NumCategories int
    . . .
)

create table DiscountCategories (
    DiscountCategoryId int,
    CategoryId int,
    MinCount int
)

1 つ目は各割引について説明し、2 つ目はカテゴリを呼び出します。最初の列には「NumCategories」列もあります。これは厳密な正規化からの逸脱ですが、クエリでは非常に便利です。

というテーブルがあるとしますStudentSubjects。適用可能な割引を見つけるには:

select s.StudentName, d.DiscountId
from (select s.StudentName, ss.CategoryId, count(*) as numCategories
      from StudentSubjects ss join
           Subjects s
           on ss.SubjectId = s.id
     ) s left outer join
     DiscountCategories dc
     on s.CategoryId = dc.CategoryId and
        s.NumCategories >= dc.MinCount left outer join
     Discounts d
     on dc.DiscountId = d.DiscountId
group by s.StudentName, d.DiscountId
having count(ss.CategoryId) = max(d.NumCategories)

最初のサブクエリは、学生のコースをカテゴリ別に要約します。次に、各科目に適用可能な割引を見つけます。最終的な集計により、すべてのカテゴリが割引の対象となることが確認されます。

于 2013-06-15T08:07:26.673 に答える