计算子查询结果SQL Oracle

时间:2017-11-30 16:33:53

标签: sql oracle count subquery distinct

所以我的代码是试图计算每个州给一部电影的评分数。这一切都很简单。我还需要计算每个州获奖电影的评分数量。

SELECT DISTINCT ad.state "State",
   COUNT(r.ratingid) OVER (PARTITION BY ad.state) "Number of Ratings",
   COUNT(
          SELECT DISTINCT r.ratingid
          FROM netflix.ratings100 r JOIN netflix.movies_awards a
                 ON r.movieid = a.movieid
              JOIN netflix.addresses ad
                 ON ad.custid = r.custid
          WHERE a.awardid IS NOT NULL
        ) OVER (PARTITION BY ad.state) "Number of Award Winning Movies Rated"
FROM netflix.addresses ad JOIN netflix.ratings100 r
   ON ad.custid = r.custid
JOIN netflix.movies_awards a
   ON r.movieid = a.movieid
GROUP BY "State"

第二个计数语句应该计算奖励ID不为空的评分数。该子查询单独工作,并返回不同的ratingID,但整体上的东西不起作用。我得到了ORA-00936:缺少表情。溶液

2 个答案:

答案 0 :(得分:1)

这似乎是一个复杂的查询。这应该是一个聚合查询。 。 。使用相关子查询:

SELECT ad.state, COUNT(DISTINCT r.ratingId) as num_rated,
       COUNT(DISTINCT CASE WHEN a.awardId IS NOT NULL THEN r.ratingid END) as num_rated_with_award
FROM netflix.addresses ad JOIN
     netflix.ratings100 r
     ON ad.custid = r.custid LEFT JOIN 
     netflix.movies_awards a
     ON r.movieid = a.movieid
GROUP BY ad.state;

注意:

  • 没有理由为列提供与其原始名称等效的别名。所以,as "State"是不必要的,除非你真的关心大写。
  • 电影可能有多个奖项,因此要获得评分数量,请使用count(distinct)
  • SELECT DISTINCT几乎不适用于GROUP BY
  • 查询不需要窗口函数。

答案 1 :(得分:0)

你没有在子查询周围加上括号 - 你有括号来表示计数,但是你需要一个额外的集合来表示它是一个子查询。

E.g;

count( (select ....) ) over ...

此外,您在内部查询中重复使用外部查询中的别名,而且没有任何内容可以将子查询与您的外部查询相关联,因此我不会认为您是'重新获得你之后的结果。

此外,您已标记了一个标识符超过30个字符的列,因此,除非您使用扩展标识符设置在12.2上,否则您将获得{{\ n} 1}}。

最后,我认为你根本不需要那个子查询;我想你可以使用条件计数,例如:

ORA-00972: identifier is too long

你可能甚至不需要那么明显;这取决于你的数据。希望你能够解决这个问题并使其符合你的要求。