gpt4 book ai didi

sql - 即使在where函数中也无法过滤null

转载 作者:行者123 更新时间:2023-12-03 08:20:09 24 4
gpt4 key购买 nike

三张表:-评分(rID,mID,星星,ratingDate)电影(mID,标题,年份,导演)审阅者(rID,名称)

找出1980年之前发行的电影的平均评级与1980年之后发行的电影的平均评级之间的差异。

(请确保计算每部电影的平均评分,然后计算1980年之前的电影和1980年之前的电影的平均评分。不要只计算1980年之前和之后的总体平均评分。)

但是总会有null,即使我在where函数中过滤了null

''''
select r.mID,sum(stars),
count(case when year>1980 and stars is not null then stars end )as "numaf",
count(case when year<1980 and stars is not null then stars end )as "numbf",
sum(case when year>1980 and stars is not null then stars end )as "sumaf",
sum(case when year<1980 and stars is not null then stars end )as "sumbf",
(("sumaf"/"numaf")-("sumbf"/"numbf")) as "difof"
from Rating r left join movie m on r.mID = m.mID
where stars is not null
group by r.mID
''''

and this is output, always has "NULL":
101 9 0 3 <NULL> 9 <NULL>
103 5 0 2 <NULL> 5 <NULL>
104 5 2 0 5 <NULL> <NULL>
106 9 0 2 <NULL> 9 <NULL>
107 8 2 0 8 <NULL> <NULL>
108 10 3 0 10 <NULL> <NULL>

最佳答案

电影的平均评分为:

select r.mID, avg(stars) as avg_stars
from Rating r
group by r.mID;

然后,要回答该问题,您可以将其加入电影并使用条件聚合:
select avg(case when year < 1980 then avg_stars) as avg_stars_pre1980,
avg(case when year > 1980 then avg_stars) as avg_stars_post1980,
(avg(case when year < 1980 then avg_stars) -
avg(case when year > 1980 then avg_stars) a
) as diff
from (select r.mID, avg(stars) as avg_stars
from Rating r
group by r.mID
) r join
movie m
on r.mID = m.mID
group by r.mID;

之所以得到 NULL是因为您认为自己正在划分 SELECT中定义的列别名。但是,您实际上是在分割字符串。所以:
(("sumaf"/"numaf")-("sumbf"/"numbf")) as "difof"

仅仅是:
(('sumaf'/'numaf')-('sumbf'/'numbf')) as difof

字符串在数字常量中解释为数字,并且前导数字转换为数字。这些没有前导数字,因此值都是 0-导致被零除。 MySQL返回 NULL以除以零而不是生成错误。

关于sql - 即使在where函数中也无法过滤null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55555272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com