2017-11-30 16 views
0

그래서 코드는 상태 당 영화에 주어진 등급 수를 계산하려고합니다. 그게 다 쉽습니다. 또한 수상작으로 선정 된 영화의 주당 등급 수를 계산해야합니다.하위 쿼리 결과 계산 SQL Oracle

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" 

두 번째 계산서는 awardID가 null이 아닌 경우에 한 등급 수를 계산해야합니다. 하위 쿼리만으로 작동하고 별개의 ratingID를 반환하지만 전체적으로 작동하지 않습니다. ORA-00936 : 표현이 없습니다. 솔루션?

+0

필요 : 테이블 정의 (열 이름 및 데이터 형식, 쿼리에 필요한 열만). 두 테이블의 일반 입력 데이터 및 해당 입력의 원하는 결과 – mathguy

답변

0

하위 쿼리 주위에 대괄호가 없습니다. 대괄호를 사용하여 개수를 표시 할 수 있지만 하위 집합임을 나타내려면 추가 집합이 필요합니다.

예 :

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

또한, 당신은 당신의 내면의 질의에 외부 쿼리에서 별칭을 재사용하고, 플러스 거기 외부 쿼리에 하위 쿼리 상관 관계를 아무것도 없다, 그래서 당신은 결과를 얻기 위하여려고하고 있다는 것을 생각하지 않는다 너는 끝이야.

또한 30 자 이상의 식별자가있는 열의 레이블을 지정 했으므로 12.2에 확장 식별자가 설정되어 있지 않으면 ORA-00972: identifier is too long이 표시됩니다.

마지막으로 나는 하위 쿼리가 전혀 필요 없다고 생각합니다. 난 그냥 당신은 심지어 별개의 것이 필요하지 않을 수도 있습니다 조건 수, 예컨대 :

SELECT DISTINCT ad.state "State", 
      COUNT(r.ratingid) over(PARTITION BY ad.state) "Number of Ratings", 
      COUNT(DISTINCT CASE WHEN a.awardid IS NOT NULL THEN r.ratingid END) over(PARTITION BY ad.state) "Num 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"; 

를 사용할 수 있다고 생각합니다; 귀하의 데이터에 따라 다릅니다. 바라건대 당신은 그걸로 놀 수 있고 당신의 요구 사항을 위해 일할 수 있습니다.

+0

나는 집계 쿼리 (당신은 당신의 행을 무너 뜨리고 싶다는 의미의 해석 쿼리와는 분명하게 구분되어 있기 때문에 Gordon의 대답이 더 정확하다는 것을 지적해야한다. 고든 (Gordon)과 달리 쿼리가 실패한 이유를 전반적으로 살펴 보는 것보다 더 집중적으로 다루었습니다. * {:-) – Boneist

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 DISTINCTGROUP BY으로 거의 적합하지 않습니다.
  • 쿼리에 창 함수가 필요하지 않습니다.