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

您有两个问题,创建折扣表然后使用它。我建议采用一种主要标准化的方法,其中涉及两个表:

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

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

第一个描述每个折扣,第二个描述类别。第一个还有“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 回答