2016-06-01 4 views
0

そのグループの任意の列にnullを持つグループを削除またはフィルタ処理またはスキップしようとしています。IDの行がNULLの場合、グループのレコードをスキップまたはフィルタリングします。

サンプルデータセットは次のとおりです。

 courseId personId pointsWon  MobileTitle 
     a1   alice  10    bluTest1 
     a1   alice  null   bluTest9 
     a1   batman  5    bluTest1 
     a1   batman  5    bluTest9 
     b2   robocop  1    test1 
     b2   robocop  null   test2 
     b2   madHatter 5    test1 
     b2   madHatter 2    test2 
     c3   batman  25    GOTHAM1 
     c3   batman  25    GOTHAM2 
     c3   superman 90    GOTHAM1 
     c3   superman null   GOTHAM2 

上記のデータセットから、私はすべての人のポイントを合計したいと考えています。任意のpointsWonがnullを持つ場合、そのpersonIdは、courseIdからスキップまたはフィルタリングする必要があります。以下は、取得しようとしているサンプルのデータセットです。

 courseId personId Total_pointsWon 
     a1   batman   10 
     b2   madHatter  7 
     c3   batman   50 

私はNOT NULL、NVLなどに基づいてフィルタリングを試みたが、そのコース内の任意のポイントは、そのユーザーのnullの場合courseIdから完全にユーザレコードをフィルタリングしたり、スキップすることができませんしています。

ご協力いただき誠にありがとうございます。

編集1: - PN:提供されるデータセットは、大きなデータセットから作成された単なるサンプルです。私は希望の出力を取得するために私のクエリ内の任意の値をハードコードすることはできません。

答えて

2

あなたはこのような何か試すことができます。

with test(courseId, personId, pointsWon, MobileTitle) as (
select 'a1','alice',  10  ,'bluTest1' from dual union all  
select 'a1','alice',  null ,'bluTest9' from dual union all 
select 'a1','batman',  5  ,'bluTest1' from dual union all 
select 'a1','batman',  5  ,'bluTest9' from dual union all 
select 'b2','robocop',  1  ,'test1' from dual union all 
select 'b2','robocop',  null ,'test2' from dual union all 
select 'b2','madHatter', 5  ,'test1' from dual union all 
select 'b2','madHatter', 2  ,'test2' from dual union all 
select 'c3','batman',  25  ,'GOTHAM1' from dual union all 
select 'c3','batman',  25  ,'GOTHAM2' from dual union all 
select 'c3','superman', 90  ,'GOTHAM1' from dual union all 
select 'c3','superman', null ,'GOTHAM2' from dual 
) 
select courseId, personId, sum(pointsWon) 
from test 
group by courseId, personId 
having count(1) = count(pointsWon) 

これは単純に合計しますと、同時に行(count(1))とpointsWonがnullではない行(count(pointsWon))をカウントしてからかどうかをチェックします2つの値は同じです

+0

選択クエリでハードコードされたcourseId値を使用することはできません。これは、サンプルデータセットが大きなデータセットからのものであり、クエリのcourseidをハードコーディングすることができないからです。あなたの答えは私のシナリオでは機能しません。 質問に明確化を追加します。 – Sid

+0

あなたの提案をありがとう。私はそれが正しい方向に私を運転したので答えとしてそれを受け入れるだろう。 – Sid

0

@Aleksejのおかげで、私は必要なものを手に入れることができました。ユニオンオールをハードコード化された値で使用する代わりに、私の内部クエリが最適化されていることを確認して、外部セレクションが効果的にフィルタリングできるように条件が満たされていない場合にnull値を提供するようにしました。

with test(courseId, personId, pointsWon, MobileTitle) as (
      select courseId, personId, pointsWon, MobileTitle 
      from <dataset> where <conditions> 
      ) 
      select courseId, personId, sum(pointsWon) 
      from test 
      group by courseId, personId 
      having count(1) = count(pointsWon) 
関連する問題