如何在mysql查询中用空值替换丢失的记录?

时间:2016-07-19 08:45:48

标签: mysql sql

我得到了一个单位的测试次数:

  select 
    date(START_DATE_TIME), product_id, BATCH_SERIAL_NUMBER, count(*) 
from 
    ( select START_DATE_TIME, product_id, uut_serial_number, BATCH_SERIAL_NUMBER 
      from uut_result    
      where START_DATE_TIME >= '2016-07-01 00:00:00' 
      and START_DATE_TIME <= '2016-07-07 23:59:59') as passtbl
      group by date(START_DATE_TIME), product_id, batch_serial_number;

我获取按天分解传递的单位的测试次数:

  select 
    date(START_DATE_TIME), product_id, BATCH_SERIAL_NUMBER, count(*) 
from 
    ( select START_DATE_TIME, product_id, uut_serial_number, BATCH_SERIAL_NUMBER 
      from uut_result    
      where START_DATE_TIME >= '2016-07-01 00:00:00' 
      and START_DATE_TIME <= '2016-07-07 23:59:59'     
      and uut_status = 'passed' ) as passtbl
      group by date(START_DATE_TIME), product_id, batch_serial_number;

我发现的是有些单元根本没有任何通行记录,所以第二个查询返回的记录少于第一个。这打破了后期处理。有没有办法捕获缺少记录并用null或其他虚拟值替换它?

2 个答案:

答案 0 :(得分:1)

select date(START_DATE_TIME), 
       product_id, 
       BATCH_SERIAL_NUMBER, 
       status, 
       count(*) 
from (select *, 
          case when uut_status = 'passed' then uut_status 
               else 'other statuses'
               end status
      from uut_result)    
where START_DATE_TIME >= '2016-07-01 00:00:00' 
and START_DATE_TIME <= '2016-07-07 23:59:59'
group by date(START_DATE_TIME), 
         status, 
         product_id, 
         batch_serial_number;

答案 1 :(得分:0)

我对此类所有内容的标准答案是使用公用表表达式和窗口函数,而不是使用group by丢失详细信息并且必须努力恢复它们。

要获得虚拟行,您可以使用这样的联合:

;with myCTE (unitId, otherdetail, passed)
as (
   select unitDetail, otherdetail,  Sum(1) Over (partition by unit) as passed
   from sourceTable
)
SELECT unitid, otherDetail, passed 
from myCTE
where startDate >= lowerbound and startdate < upperBound

UNION
SELECT unitId, otherdetail, 0 as passed
from sourceTable S
where not exists (select 1 from myCTE where myCTE.unitId = S.unitID
        and  startDate >= lowerbound and startdate < upperBound)

我认为这是一个很好的粗略草图,表明你需要什么。 我也会用半开间隔来比较时间 关于startTime在11:59:59和下一个0:00之间的关闭机会 一天。

你从来没有提到过什么数据库引擎[Duh,它在我正在寻找标签的标题中]。 CTE可用于SQL Server和Oracle,但不适用于MySQL。

对于大多数用途,您可以替换相关的子查询,但您必须重复自己。 &#39;;&#39;在WITH之前是SQL的一个怪癖 服务器

由于您是MySQL,因此必须将CTE复制为引用它的子查询。或者你可能有表值函数??