2016-07-19 3 views
0

私はユニットで撮影したテストの数を取得する:mysqlクエリーで不足しているレコードをnullに置き換えるにはどうすればいいですか?

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; 

私が探してる何がということですすべてのパスレコードを持たないユニットがあるため、2番目のクエリは最初のレコードよりも少ないレコードを返します。これは事後処理を破るものです。レコードの不在をキャッチし、それをヌルまたは他のダミー値に置き換える方法はありますか?

答えて

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; 
0

このようなすべてのものへの私の標準的な答えは、代わりにあなたが細部を失い、それを回復するために苦労しなければならない場所でグループを使用しての、共通テーブル式とウィンドウ関数を使用することです。

ダミー行を取得するには、次のように労働組合を使用する場合があります。

;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の間にあるオフチャンスについては、 日です。

あなたはdbエンジン[Duh、それはタイトルの中に私がTAGを探していた]を何も言及しませんでした。 CTEはSQL ServerとOracleでは使用できますが、MySQLでは使用できません。

ほとんどの用途では、相関サブクエリを使用できますが、自分自身を繰り返す必要があります。 ';' WITHがSQL サーバの奇妙なものである前に。

あなたはMySQLであるため、参照されるサブクエリとしてCTEを複製する必要があります。あるいは、あなたはテーブル値関数を持っていますか?

関連する問題