0

SQL クエリのヘルプを探しています。(私はオラクルを使用しています。)

2 つの異なる選択ステートメントの結合であるクエリがあります。結果のデータは次のようになります。

Col1     Col2     Col3
XXX      ValA     Val1
XXX      ValB     Val2
YYY      ValA     Val1
YYY      ValA     Val2

この設定では、Col1 = XXX がデフォルト値で、Col1 = YYY が実際の値です。実際の値 (YYY) はデフォルト値よりも優先されるべきです。実際の値は、列 2 と 3 で定義されます。

これらの結果を次のようにダウンセレクションしようとしています。

Col1     Col2     Col3
XXX      ValB     Val2
YYY      ValA     Val1
YYY      ValA     Val2

最初の行が削除されていることに注意してください...これは、実際の値 (行 3 の YYY) がデフォルト値 (XXX) よりも優先されるためです。

これにアプローチする方法について何か考えはありますか?

4

3 に答える 3

2

col2 と col3 が XXX と別の値で表示されるすべての行を除外したいとします。

分析関数を使用してサブクエリで適切なカウントを行うことにより、このフィルターを実装できます。

select col1, col2, col3
from (select t.*,
             count(*) over (partition by col2, col3) as numcombos,
             sum(case when col1 = 'XXX' then 1 else 0 end) over (partition by col2, col3) as numxs
      from t
     ) t
where numcombos = numxs or (col1 <> 'xxx')
于 2012-11-14T15:28:19.407 に答える
1

私の本能は、分析関数を使用することです。

select distinct 
       first_value(col1) 
          over (partition by col2, col3 
                order by case col1 
                when 'XXX' then 1 
                else 0 end asc) as col1,
       col2, 
       col3 
from table1

ただし、テーブルが大きく、インデックスが作成されている場合は、完全な外部結合を使用してこれを解決することをお勧めします (可能な値が 2 つしかないため可能です)。

select coalesce(rl.col1, dflt.col1) as col1, 
       coalesce(rl.col2, dflt.col2) as col2,
       coalesce(rl.col3, dflt.col3) as col3
from (select * from table1 where col1 = 'XXX') dflt
full outer join (select * from table1 where col1 <> 'XXX') rl
on dflt.col2 = rl.col2 and dflt.col3 = rl.col3;

【SQLFiddleでの解決】

于 2012-11-14T18:08:56.503 に答える
0

次のようなトリックを使用できると思います。

select
  case when
  max(case when col1<>'XXX' then col1 end) is null then 'XXX' else
  max(case when col1<>'XXX' then col1 end) end as col1, 
  col2,
  col3
from
  your_table
group by col2, col3

デフォルト値を null に変換してから、col3 でグループ化します。null と値の間の最大値が、探している値です。これはサンプル データで機能しますが、実際のデータがどのようになっているかによって異なります。

于 2012-11-14T15:27:09.873 に答える