使用SQL比较两个计数结果
我的数据库考试真的需要帮助。 我有一个电影数据库,我必须列出每一个比文森特·卡塞尔拍得更多电影的演员。 我的模式是使用SQL比较两个计数结果,sql,oracle,Sql,Oracle,我的数据库考试真的需要帮助。 我有一个电影数据库,我必须列出每一个比文森特·卡塞尔拍得更多电影的演员。 我的模式是 CREATE TABLE "ACTOR" ( "codactor" NUMBER(*,0), "name" VARCHAR2(50 BYTE), "surname" VARCHAR2(50 BYTE), "country" VARCHAR2(50 BYTE) ) SEGMENT CREATION IMMEDIATE CR
CREATE TABLE "ACTOR"
(
"codactor" NUMBER(*,0),
"name" VARCHAR2(50 BYTE),
"surname" VARCHAR2(50 BYTE),
"country" VARCHAR2(50 BYTE)
) SEGMENT CREATION IMMEDIATE
CREATE TABLE "FILM"
(
"CODFILM" NUMBER(*,0),
"title" VARCHAR2(100 BYTE),
"GENERE" VARCHAR2(50 BYTE),
"duration" NUMBER(*,0),
"year" NUMBER(*,0),
"earnings" FLOAT(63),
"valutation" NUMBER(2,1)
) SEGMENT CREATION IMMEDIATE
CREATE TABLE "Plays"
(
"CODFILM" NUMBER(*,0),
"codactor" NUMBER(*,0),
"role" VARCHAR2(300 BYTE),
"income" FLOAT(63)
) SEGMENT CREATION IMMEDIATE
考虑到这一点,我不知道如何计算文森特·卡塞尔拍了多少部电影,然后将结果与每个演员拍的电影数量进行比较,只选择比文森特·卡塞尔拍得更多的演员。
感谢大家的帮助。这将为您提供文森特·卡塞尔主演的多部电影:
select A.codactor, COUNT(P.codfilm) HowManyMovies
from Plays P join Actor A
on P.codactor = A.codactor
where A.name = 'Vincent Cassel'
group by A.codactor
这将给你带来比《文森特·卡塞尔》更多电影的演员
SELECT A.name ,A.surname,count(*) HowManyMovies
FROM Plays P
INNER JOIN Actor A
ON P.codactor = A.codactor
GROUP BY A.name ,A.surname
HAVING count(*) > (
SELECT COUNT(P.codfilm) HowManyMovies
FROM Plays P
INNER JOIN Actor A
ON P.codactor = A.codactor
WHERE A.name = 'Vincent Cassel'
GROUP BY A.codactor
)
首先,让我们计算一下每个演员在电影中的主演次数 然后,让我们只选择这些演员,他们的戏剧数量高于文森特·卡塞尔的最大数量(这是为了在数据库中有多个文森特·卡塞尔的情况下正确处理)。包括
coalesce()
让我们来处理一个没有剧本或演员不在我们的表中的情况
with act_plays as (
select a."codactor", a."name", a."surname", count(*) as playcount
from "ACTOR" a
inner join "Plays" p on
a."codactor" = p."codactor"
group by a."codactor", a."name", a."surname"
)
select *
from act_plays
where playcount > coalesce((
select max(playcount) -- if more than one Vincent Cassel let's take max val
from act_plays
where "name" = 'Vincent' and "surname" = 'Cassel'
), 0)
在组合演员和戏剧时,我们可以安全地使用
内部联接
,因为我们需要比文森特·卡塞尔主演更多电影的演员,因此,如果文森特的值为0,我们将丢弃那些没有主演任何电影的演员。我已经删除了所有不同的dbms标记。将其中一个放回原处,即实际使用的dbms。添加一些示例表数据和预期结果-所有内容都是格式化文本,而不是图像。并向我们展示您当前的查询尝试。Oracle SyntxIt将列名强制为非标准大小写似乎不是一个好的做法。现在您有了ACTOR.codactor
(列名强制小写),但有了“FILM.CODFILM”(不区分大小写)和“Plays.CODFILM
(表名强制大小写混合,列名不区分大小写)。工作真的很痛苦。你现在真的在参加考试吗?