如何使用聚合函数加入视图?

How to join Views with aggregate functions?

我的问题:

#4 中,我在连接两个视图时遇到问题,因为另一个视图具有聚合函数。与 #5

相同

问题:

  1. 创建一个名为 studentDetails 的视图,它应该显示学生姓名、注册日期、每学分总价和注册科学或历史学科学生的学科描述。

  2. 创建一个视图,将其命名为 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)
);

不确定我是否完全理解,但我认为是这样的:

备注:

  1. 始终使用 ID 来过滤记录:
  • where su.SubjId in (1,2)

  1. 您可以在子查询中使用 max() 找到最大记录,并将其与主查询连接起来,如下所示:
  • where su2.SubjId = su.SubjId
    

  1. 您不能将别名用作过滤器,因此您可以像这样过滤它:
  • ( 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

因为这似乎是一道作业题。

您需要使用 JOINs。您当前的查询:

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 ONLYFETCH FIRST ROW WITH TIES.