2017-11-30 18 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" 

2番目のカウントステートメントは、awardIDがnullでないレーティングの数をカウントする必要があります。サブクエリは単独で動作し、別個のratingIDを返しますが、全体としては機能しません。 ORA-00936:表現がありません。ソリューション?

+0

必須:テーブル定義(クエリに必要な列の列名とデータ型)。 2つのテーブル内の典型的な入力データ、およびその入力からの所望の結果を含む。 – 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

私は、ゴードンの答えがより正確であることを指摘する必要があります。なぜなら、あなたは集計クエリの後にいるからです。(分析クエリとは別に、行を崩壊させたいという意味です。ゴードンと違って、全体的に見るよりもクエリが失敗した理由に焦点を当てていました。 * {:-) – 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 DISTINCTは、GROUP BYでほとんど決して適切ではありません。
  • クエリにはウィンドウ関数が必要ありません。
関連する問題