我有桌子;类别,主题。
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种音乐。同样,我们必须记录许多组合,每个组合都有不同的折扣金额。如何创建具有类别数量和折扣的组合表?
答案 0 :(得分: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)
第一个子查询按类别总结了学生课程。然后,它会找到每个主题的适用折扣。最终聚合确保折扣涵盖所有类别。