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

最后两行缺少数字的原因是因为当天数据库中只有 WM、WZ 合约的看跌期权。这与 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

首先说明:我没有运行这个,所以可能有语法错误。

第二个注意事项:我coalesce()在外部select语句中使用以防止 NULL 值引起问题。

于 2013-01-31T19:40:21.740 回答