【问题标题】:mysql join/union 0 for non-existentmysql join/union 0 表示不存在
【发布时间】:2013-01-15 18:51:59
【问题描述】:

我正在尝试提取期权交易量的报告数据以创建摘要。我的查询目前是这样的:

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 合约调用缺少零,因为根本没有数据,而不是零交易的数据。

如果这有意义,请告诉我。

【问题讨论】:

  • 你能再澄清一点吗?
  • 是的,当然。我将在上面进行简化。
  • 所以您正在寻找PIVOT
  • 是的,这就是我要找的词。现在我知道要查找什么,似乎有很多关于此的文档。谢谢!

标签: mysql join null


【解决方案1】:

这是一个典型的问题,您试图获得聚合结果,即使没有特定聚合的行。

解决方案是创建一个包含所有组合的驱动程序表,然后将其余的连接到此。

在这种情况下,创建驱动表是相当容易的,所以查询如下:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    相关资源
    最近更新 更多