【问题标题】:MYSQL fill group by "gaps"MYSQL 按“空白”填充组
【发布时间】:2014-12-29 21:05:29
【问题描述】:

我正在尝试通过使用辅助表来填补使用组后的空白,你能帮忙吗?

辅助表处理没有订单的日子

date        quantity
2014-01-01  0
2014-01-02  0
2014-01-03  0
2014-01-04  0
2014-01-05  0
2014-01-06  0
2014-01-07  0

按“订单”表中的结果分组

date        quantity
2014-01-01  7
2014-01-02  1
2014-01-04  2
2014-01-05  3

将“orders”表与“aux table”连接起来的期望结果

date        quantity
2014-01-01  7
2014-01-02  1
2014-01-03  0
2014-01-04  2
2014-01-05  3
2014-01-06  0
2014-01-07  0

【问题讨论】:

  • 什么查询产生了您的group by result?如果我正确理解您的问题,我认为您需要在aux 表中使用带有这些结果的outer join。您的示例数据有点误导...
  • 我的问题是外连接。“日期”表已经创建为“辅助表”
  • 是的,通过辅助表的结果外部加入组...

标签: mysql sql group-by left-join


【解决方案1】:

在不知道如何创建group by result 表的情况下,您在outer join 中寻找什么,也许是coalesce。像这样的:

select distinct a.date, coalesce(b.quantity,0) quantity
from aux a 
    left join yourgroupbyresults b on a.date = b.date

请注意,您可能需要也可能不需要distinct——取决于您的数据。


编辑,给定你的 cmets,这应该可以工作:

select a.date, count(b.date_sent)
from aux a
    left join orders b on a.date = date_format(b.date_sent, '%Y-%m-%d')
group by a.date

【讨论】:

  • 我的分组来自:select date_format(date_sent, '%Y-%m-%d'), count(*) as quantity from orders
【解决方案2】:

使用你的结果会是这样的:

SELECT a.date
      ,COALESCE(b.quantity,0) as quantity
FROM auxtable a
LEFT JOIN groupbyresult b
  ON a.date = b.date

您也可以在与左连接相同的查询中进行分组:

SELECT a.date
      ,COALESCE(COUNT(b.somefield),0) as quantity
FROM auxtable a
LEFT JOIN table1 b
  ON a.date = b.date
GROUP BY a.date

【讨论】:

    【解决方案3】:

    解决此类问题的一种常见方法是使用具有要返回的不同日期列表的行源,然后对有间隙的表执行外连接。这样,您就可以找回所有日期,并且可以用零替换“缺失”的数量值。

    例如:

    SELECT d.date
         , IFNULL(SUM(s.quantity),0) AS quantity
      FROM distinct_list_of_dates d
      LEFT
      JOIN information_source s
        ON s.date = d.date
     GROUP BY d.date
    

    尚不清楚为什么 GROUP BY 会消除某些日期值。我们可能会推测您正在使用 MySQL 对 ANSI 标准 GROUP BY 语义的扩展,那就是消除行。或者,您可能有一个不包括行的 WHERE 子句。但我们只是猜测。


    跟进根据 OP 在 cmets 中透露的进一步信息...

    在上面的查询中,将distinct_list_of_dates 替换为aux,将information_source 替换为orders,并调整连接谓词以考虑日期时间与日期的比较

    SELECT d.date
         , IFNULL(SUM(s.quantity),0) AS quantity
      FROM aux d
      LEFT
      JOIN orders s
        ON s.date >= d.date
       AND s.date <  d.date + INTERVAL 1 DAY
     GROUP BY d.date
    

    【讨论】:

    • 。 .我想你错过了第一个表确实有日期列表。
    • ...@GordonLinoff:不可能说出导致 OP 观察到的行为的原因。我给出的答案是针对稀疏数据的一般问题的一般方法。在 OP 示例中 distinct_list_of_dates 行源可能确实是aux 表,或内联视图(SELECT a.date FROM aux a GROUP BY a.date)。没有实际的规格,我们只是猜测。 (如果 OP 查询正在执行 GROUP BY some_foo,我们预计结果中可能会丢失一些 date 值。
    猜你喜欢
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多