【问题标题】:Mysql subquery with sum causing problems带有 sum 导致问题的 Mysql 子查询
【发布时间】:2011-08-26 14:42:49
【问题描述】:

这是我遇到的问题的摘要版本,但触及了我的问题的核心。真正的问题涉及每月数据表的大量 UNION 组,但 ​​SQL 将是巨大的并且什么都不添加。所以:

SELECT entity_id, 
    sum(day_call_time) as day_call_time
            from (
                SELECT entity_id, 
                    sum(answered_day_call_time) as day_call_time
                    FROM XCDRDNCSum201108 
                    where (day_of_the_month >= 10 AND  day_of_the_month<=24) 
                    and LPAD(core_range,4,"0")="0987" 
                    and LPAD(subrange,3,"0")="654" 
                    and SUBSTR(LPAD(core_number,7,"0"),4,7)="3210"
            ) as summary

问题是:当子查询XCDRDNCSum201108中的表没有返回行时,因为是求和,所以列值包含null。 entity_id 是主键的一部分,不能为空。 如果我取出 sum,只查询 entity_id,子查询不包含行,因此外部查询不会失败,但是当我使用 sum 时,我得到错误 1048 Column 'entity_id' cannot be null

我该如何解决这个问题?有时没有数据。

【问题讨论】:

  • 您是否缺少GROUP BY entity_id
  • 否,此查询中没有分组。给大家的备忘录:我不是 DBA!
  • 您的内部查询将在除 MySQL 之外的所有 RDBMS 中无效,因为您选择 entity_id 但未按其分组。如果存在多个 entity_id,您希望它返回什么?
  • 看起来组是问题所在。应该不会导致添加分组依据的困难,因为此查询是补充呼叫计数器的一部分,因此应该修复它。想要将其发布为答案以便我投票?

标签: mysql null subquery sum


【解决方案1】:

您完全过度使用查询...预先在内部求和,然后在外部再次求和。此外,我知道您不是 DBA,但如果您曾经进行过聚合,您通常需要其分组依据的标准。在此处介绍的情况下,您将获得所有实体 ID 的调用总和。所以你必须有一个由任何非聚合组成的组。但是,如果您只关心总计而不考虑 entity_ID,那么您可以跳过分组依据,但也不包括实际的实体 ID...

如果您希望包含显示每个特定实体 ID 的实际时间...

SELECT
      entity_id, 
      sum(answered_day_call_time) as day_call_time,
      count(*) number_of_calls
   FROM
      XCDRDNCSum201108 
   where
          (day_of_the_month >= 10 AND  day_of_the_month<=24) 
      and LPAD(core_range,4,"0")="0987" 
      and LPAD(subrange,3,"0")="654" 
      and SUBSTR(LPAD(core_number,7,"0"),4,7)="3210"
   group by
      entity_id

这会导致类似(虚构数据)

Entity_ID   Day_Call_Time   Number_Of_Calls
1           10              3
2           45              4
3           27              2

如果您只关心总通话时间

SELECT
      sum(answered_day_call_time) as day_call_time,
      count(*) number_of_calls
   FROM
      XCDRDNCSum201108 
   where
          (day_of_the_month >= 10 AND  day_of_the_month<=24) 
      and LPAD(core_range,4,"0")="0987" 
      and LPAD(subrange,3,"0")="654" 
      and SUBSTR(LPAD(core_number,7,"0"),4,7)="3210"

这会导致类似(虚构数据)

Day_Call_Time   Number_Of_Calls
82              9

【讨论】:

    【解决方案2】:

    会:

    sum(answered_day_call_time) as day_call_time
    

    改为

    ifnull(sum(answered_day_call_time),0) as day_call_time
    

    工作?我假设这里是 mysql,但 coalesce 函数也可以/应该工作。

    【讨论】:

    • 我想我会同意上面的 Martin Smiths 点。甚至不敢开始探索合并意味着什么!尤其是周五下午十点到五点。
    • 嘿嘿这只是意味着返回第一个非空变量;)
    猜你喜欢
    • 2012-01-01
    • 2017-04-22
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多