0

概要を作成するために、オプション ボリュームのレポート データを取得しようとしています。私のクエリは現在これです:

select concat(contract, ',', group_concat(traded), ',', sum(traded))
from 
(
    select contract, put_call, sum(oov+gv+pv) as traded
    from report_data
    where contract <> "AO" and date = '2013-01-30'
    group by contract, put_call
    order by contract asc, put_call asc
) temp
group by contract

戻り値:

7A,9600,0,9600
BV,100,400,500
WA,0,900,900
WM,500,500
WZ,0,0

最後の 2 行に数字がないのは、この日にデータベースに WM、WZ 限月のプットしかないためです。これは、7A または WA とは対照的です。7A または WA では、プットとコールの両方のデータがありますが、出来高はありません (したがってゼロ)。

コントラクトのプット (またはコール) がないゼロを生成するために、テーブルを結合または結合しようとしましたが、それを理解できないようです。

助言がありますか?

====================================

より簡単:

データ:

Contract    Put_call    Traded    OtherData
  A           P           10        blah
  A           C           5         blah
  B           P           10        blah
  B           C           0         blah
  C           P           10        blah

クエリの結果は次のようになります。

A, 5, 10, 15
B, 0, 10, 10
C, 0, 10, 10

私のクエリは現在これを返します:

A, 5, 10, 15
B, 0, 10, 10
C, 10, 10

ゼロ取引のデータとは対照的に、データがまったくないため、C コントラクト コールのゼロが欠落しています。

これが理にかなっている場合はお知らせください。

4

1 に答える 1

0

これは、特定の集計の行がない場合でも集計結果を取得しようとする場合の典型的な問題です。

解決策は、すべての組み合わせを含むドライバー テーブルを作成し、残りをこれに結合することです。

この場合、ドライバー テーブルの作成はかなり簡単なので、クエリは次のようになります。

select concat(contract, ',', group_concat(coalesce(traded, 0)), ',', coalesce(sum(traded), 0))
from (select distinct contract, 'P' as put_call from report_data union all
      select distinct contract, 'C' as put_call from report_data
     ) driver left outer join
     (select contract, put_call, sum(oov+gv+pv) as traded
      from report_data
      where contract <> "AO" and date = '2013-01-30'
      group by contract, put_call
     ) temp
     on driver.contract = temp.contract and driver.put_call = temp.put_call
group by contract

最初の注意: 私はこれを実行していないため、構文エラーがある可能性があります。

2 番目の注意:coalesce()外側のselectステートメントで使用して、NULL 値が問題を引き起こさないようにしました。

于 2013-01-31T19:40:21.740 に答える