2017-08-03 12 views
0

私はゲームで各プレイヤーの得点を記録するクリケットデータベースに簡単なテーブルを持っています。フィールドは、プレイヤーの名前、特定のゲームで得点したラン、試合の最後に「出ていない」、「出ていない」のいずれかです。明らかに、プレイヤーはプレイした試合と同じくらい多くの時間テーブルに出現する選択クエリでCASE WHENを使用するPostgreSQL

プレイヤーごとに平均「ラン」を与えるクエリを実行したい。クリケットでは、これは彼らの総ランを取って、彼らは「アウト」された回数だけで割ることによって行われ、私がしようとしているコードは次のようなものです:

SELECT name, 
     SUM(runs)/COUNT(CASE WHEN playerout = 'out' THEN name END) 
FROM players 
GROUP BY name; 

このアイデアは、のためにということで各プレイヤーは、彼らのランを合計し、「ノウトウ」を無視して、それらが「出ている」回数だけ分ける。私は 'ELSE 0'を追加しようとしましたが、整数型と文字型が混在しているためにエラーが返されます。

クエリは、彼らが出て終了しているか否かにかかわらず、すべてのゲームでは、プレイヤーの実行を追加し、彼らが出ていた回数によって分割する必要があります更新。例えば、1人のプレイヤーが次のようなマッチをした場合: 1. 10回実行中、 2. 20回実行中、 3. 30回実行中、実行中ではありません 平均回数は合計実行回数(10 + 20 + 30)= 60、彼らが出ていた回数(2)で割り算したので、その平均は30となります。

おそらく私が実現していない明らかな解決策があります - 何か提案がありますか?

+1

サンプルデータ(出入り口を含む)と期待される結果を提供してもらえますか? –

答えて

0

を使用することができますでる。以下の例では、NULLを使用しています。このようにすると、division by zeroエラーが発生しないことが保証されます。

SELECT 
    name, 
    CASE WHEN SUM(CASE WHEN playerout = 'out' THEN 1 ELSE 0 END) = 0 
     THEN NULL 
     ELSE 
      SUM(runs) 
      /SUM(CASE WHEN playerout = 'out' THEN 1 ELSE 0 END) 
    END AS runs_divided_by_dismissals 
FROM players 
GROUP BY name; 
+0

提案していただきありがとうございます。私はこのようなことを試してみましたが、あなたの提案の問題は、終了した時点での試合でのランの追加に過ぎないということです。私はすべてのプレイヤーを(すべてのゲームから、彼らが出ているかどうかにかかわらず)合計して、それらが出ていた回数だけ分けていくという質問が必要です。例えば、10試合(出走)、20試合(出走)、30試合(出走)、平均は(10 + 20 + 30)/ 2 = 30である必要があります。 –

+0

あなたの予想は?誰かが2回のイニングをした場合、それぞれ20点の得点を返し、それぞれにアウトではない? –

+0

良い質問、何か私は考えるべきだった、彼らは技術的に平均を持っていない場合、彼らは 'N/A'またはその特定のプレイヤーのために何かが表示されていない場合は最高です –

0

あなたはすべての選手にかかわらず、彼らはどんな試合でアウトされているか否かのに報告したい場合、あなたは彼らが行ったことがないときの値を定義する必要が

SUM(CASE WHEN playerout = 'out' THEN 1 ELSE 0 END) 
+1

これをもう一度確認してください。 'COUNT'は1をカウントし、0は..... ..... – Nicarus

+0

はいです。私は見落とした。 TY –

+0

私はまた、あなたがそれぞれのレコードが1回の実行のためだけにアカウントすると仮定していると思います。 – Nicarus

関連する問題