我得到了一个单位的测试次数:
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或其他虚拟值替换它?
答案 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复制为引用它的子查询。或者你可能有表值函数??