如何使用聚合函数加入视图?
How to join Views with aggregate functions?
我的问题:
在 #4 中,我在连接两个视图时遇到问题,因为另一个视图具有聚合函数。与 #5
相同
问题:
创建一个名为 studentDetails 的视图,它应该显示学生姓名、注册日期、每学分总价和注册科学或历史学科学生的学科描述。
创建一个视图,将其命名为 BiggestPrice,它将显示主题 ID 和所有主题的每单位最高总价。该视图应仅显示大于 1000 的最高单价。
--4.) Create a view name it as studentDetails, that would should show the student name,
-- enrollment date the total price per unit and subject description of students who are
-- enrolled on the subject Science or History.
CREATE VIEW StudentDetails AS
SELECT StudName, EnrollmentDate
--5.) Create a view, name it as BiggestPrice, that will show the subject id and highest total
-- price per unit of all the subjects. The view should show only the highest total price per unit
-- that are greater than 1000.
CREATE VIEW BiggestPrice AS
SELECT SubjId, SUM(Max(Priceperunit)) FROM Student, Subject
GROUP BY Priceperunit
这是我的 table:
CREATE TABLE Student(
StudentId char(5) not null,
StudName varchar2(50) not null,
Age NUMBER(3,0),
CONSTRAINT Student_StudentId PRIMARY KEY (StudentId)
);
CREATE table Enrollment(
EnrollmentId varchar2(10) not null,
EnrollmentDate date not null,
StudentId char(5) not null,
SubjId Number(5) not null,
constraint Enrollment_EnrollmentId primary key (EnrollmentId),
constraint Enrollment_StudentId_FK foreign key (StudentId) references Student(StudentId),
constraint Enrollment_SubjId_Fk foreign key (SubjId) references Subject(SubjId)
);
Create table Subject(
SubjId number(5,0) not null,
SubjDescription varchar2(200) not null,
Units number(3,0) not null,
Priceperunit number(9,0) not null,
Constraint Subject_SubjId_PK primary key (SubjId)
);
不确定我是否完全理解,但我认为是这样的:
备注:
- 始终使用 ID 来过滤记录:
where su.SubjId in (1,2)
- 您可以在子查询中使用 max() 找到最大记录,并将其与主查询连接起来,如下所示:
-
where su2.SubjId = su.SubjId
- 您不能将别名用作过滤器,因此您可以像这样过滤它:
( su.Units * su.Priceperunit ) > 1000
CREATE VIEW StudentDetails AS
select s.StudName,
e.EnrollmentDate,
su.SubjDescription,
su.Units * su.Priceperunit TotalPrice
from student s
inner join Enrollment e
on e.StudentId = s.StudentId
inner join Subject su
on su.SubjId = e.SubjId
where su.SubjId in (1,2)
CREATE VIEW BiggestPrice AS
select su.SubjId, ( su.Units * su.Priceperunit ) TotalPrice
from Subject su
where ( su.Units * su.Priceperunit ) =
(
select max(su2.Units * su2.Priceperunit)
from Subject su2
where su2.SubjId = su.SubjId
)
and ( su.Units * su.Priceperunit ) > 1000
因为这似乎是一道作业题。
您需要使用 JOIN
s。您当前的查询:
CREATE VIEW StudentDetails AS
SELECT StudName, EnrollmentDate
没有 FROM
子句,您对问题 5 的查询使用没有 WHERE
过滤器的旧逗号连接语法;这与 CROSS JOIN
相同,会将每个学生与每个科目联系起来,这不是您想要的。
不要使用旧的逗号连接语法并使用 ANSI 连接并明确说明连接条件。
SELECT <expression list>
FROM student s
INNER JOIN enrollment e ON ...
INNER JOIN subject j ON ...
然后可以根据table之间的关系填写...
(一般是一个table的主键=另一个[=51=的外键) ]).
然后对于 <expression list>
,您需要在问题中包含要求的列:学生姓名和入学日期以及科目名称将只是来自相应 table 的那些列;和每单位总价(我假设实际上是每个主题的总价)将是一个计算。
那么第4题的后半部分
who are enrolled on the subject Science or History.
添加 WHERE
过滤器以仅包含这些主题的行。
对于问题 5,您不需要任何 JOINS
,因为该问题仅询问 SUBJECT
table.
中的详细信息
您需要添加一个 WHERE
过滤器以显示“仅显示大于 1000 的最高单价”。这是一个简单的乘法,然后您可以通过比较是否为 > 1000
.
来过滤
然后您需要将查询限制为return 仅具有“所有主题的单位总价最高”的行。从 Oracle 12 开始,这将通过按总价降序排列的 ORDER BY
子句完成,然后使用 FETCH FIRST ROW ONLY
或 FETCH FIRST ROW WITH TIES
.
我的问题:
在 #4 中,我在连接两个视图时遇到问题,因为另一个视图具有聚合函数。与 #5
相同问题:
创建一个名为 studentDetails 的视图,它应该显示学生姓名、注册日期、每学分总价和注册科学或历史学科学生的学科描述。
创建一个视图,将其命名为 BiggestPrice,它将显示主题 ID 和所有主题的每单位最高总价。该视图应仅显示大于 1000 的最高单价。
--4.) Create a view name it as studentDetails, that would should show the student name,
-- enrollment date the total price per unit and subject description of students who are
-- enrolled on the subject Science or History.
CREATE VIEW StudentDetails AS
SELECT StudName, EnrollmentDate
--5.) Create a view, name it as BiggestPrice, that will show the subject id and highest total
-- price per unit of all the subjects. The view should show only the highest total price per unit
-- that are greater than 1000.
CREATE VIEW BiggestPrice AS
SELECT SubjId, SUM(Max(Priceperunit)) FROM Student, Subject
GROUP BY Priceperunit
这是我的 table:
CREATE TABLE Student(
StudentId char(5) not null,
StudName varchar2(50) not null,
Age NUMBER(3,0),
CONSTRAINT Student_StudentId PRIMARY KEY (StudentId)
);
CREATE table Enrollment(
EnrollmentId varchar2(10) not null,
EnrollmentDate date not null,
StudentId char(5) not null,
SubjId Number(5) not null,
constraint Enrollment_EnrollmentId primary key (EnrollmentId),
constraint Enrollment_StudentId_FK foreign key (StudentId) references Student(StudentId),
constraint Enrollment_SubjId_Fk foreign key (SubjId) references Subject(SubjId)
);
Create table Subject(
SubjId number(5,0) not null,
SubjDescription varchar2(200) not null,
Units number(3,0) not null,
Priceperunit number(9,0) not null,
Constraint Subject_SubjId_PK primary key (SubjId)
);
不确定我是否完全理解,但我认为是这样的:
备注:
- 始终使用 ID 来过滤记录:
where su.SubjId in (1,2)
- 您可以在子查询中使用 max() 找到最大记录,并将其与主查询连接起来,如下所示:
-
where su2.SubjId = su.SubjId
- 您不能将别名用作过滤器,因此您可以像这样过滤它:
( su.Units * su.Priceperunit ) > 1000
CREATE VIEW StudentDetails AS
select s.StudName,
e.EnrollmentDate,
su.SubjDescription,
su.Units * su.Priceperunit TotalPrice
from student s
inner join Enrollment e
on e.StudentId = s.StudentId
inner join Subject su
on su.SubjId = e.SubjId
where su.SubjId in (1,2)
CREATE VIEW BiggestPrice AS
select su.SubjId, ( su.Units * su.Priceperunit ) TotalPrice
from Subject su
where ( su.Units * su.Priceperunit ) =
(
select max(su2.Units * su2.Priceperunit)
from Subject su2
where su2.SubjId = su.SubjId
)
and ( su.Units * su.Priceperunit ) > 1000
因为这似乎是一道作业题。
您需要使用 JOIN
s。您当前的查询:
CREATE VIEW StudentDetails AS
SELECT StudName, EnrollmentDate
没有 FROM
子句,您对问题 5 的查询使用没有 WHERE
过滤器的旧逗号连接语法;这与 CROSS JOIN
相同,会将每个学生与每个科目联系起来,这不是您想要的。
不要使用旧的逗号连接语法并使用 ANSI 连接并明确说明连接条件。
SELECT <expression list>
FROM student s
INNER JOIN enrollment e ON ...
INNER JOIN subject j ON ...
然后可以根据table之间的关系填写...
(一般是一个table的主键=另一个[=51=的外键) ]).
然后对于 <expression list>
,您需要在问题中包含要求的列:学生姓名和入学日期以及科目名称将只是来自相应 table 的那些列;和每单位总价(我假设实际上是每个主题的总价)将是一个计算。
那么第4题的后半部分
who are enrolled on the subject Science or History.
添加 WHERE
过滤器以仅包含这些主题的行。
对于问题 5,您不需要任何 JOINS
,因为该问题仅询问 SUBJECT
table.
您需要添加一个 WHERE
过滤器以显示“仅显示大于 1000 的最高单价”。这是一个简单的乘法,然后您可以通过比较是否为 > 1000
.
然后您需要将查询限制为return 仅具有“所有主题的单位总价最高”的行。从 Oracle 12 开始,这将通过按总价降序排列的 ORDER BY
子句完成,然后使用 FETCH FIRST ROW ONLY
或 FETCH FIRST ROW WITH TIES
.