2017-05-26 5 views
1

SQL Server 2008を使用しています。いくつかのテーブルのデータに基づいてパフォーマンスメトリックを計算するT-SQLクエリを作成しようとしています。残念ながら、私は計算の1つにこだわっていて、何が間違っているか把握できません。私は非常に任意の助けいただければ幸いです:T-SQLジョインクエリで列を掛ける

  1. 計算が生成される総を必要とする(表ShiftHourCountsから)、(表ShiftReportScrapから)総スクラップ片、及び(Downtimeクエリから)総ダウンタイム

  2. 私は主に私自身の教育/トラブルシューティングのために各演算/計算をクエリに追加しようとしました。

  3. なぜQ列がゼロを返すのか分かりません。 Q = Tok/Tpであり、クエリはTokとTpの両方を正しく返して計算します。次の例では、Qは0.994

  4. です。クエリは現在、Q、A、P、およびOEE以外のすべてに対して正しい値を返します。 Q、A、P、及びOEEは常にゼロ

現在のクエリを返す:整数の除算から

--OEE= A*P*Q (this is the final desired result/ calculation) 
--A= (Planned run time - Unplanned Down Time)/Planned run time 
--A= (Prt - Dtu)/Prt 
--Prt= Maximum Available Time - Planned Down Time 
--Prt= Mat=DTp 
--Effective production time= Planned run time - Unplanned Down Time 
--Ept=Prt-DTu 
--P= (BDT*total number of produced parts)/Effective production time 
--P= (BDT*Tp)/Ept 
--Q= Total number of OK parts/Total number of produced parts 
--Q= Tok/Tp 

select 
    sm.SR_ID, sm.SR_PartID, sm.SR_StartTime, 
    isnull(sm.SR_EndTime,GETDATE()) AS EndTime, 
    isnull(sm.SR_BDT,1) AS BDT, 
    DATEDIFF(n, sm.SR_StartTime, isnull(sm.SR_EndTime, GETDATE())) AS Prt, 
    isnull(p.TotalProduced,0) AS Tp, 
    isnull(s.Scrap,0) AS Scrap, 
    (isnull(p.TotalProduced, 0) - isnull(s.Scrap, 0)) AS Tok, 
    isnull(dt.DownTimeDuration, 0) AS DTu, 
    ((isnull(p.TotalProduced, 0) - isnull(s.Scrap, 0))/isnull(p.TotalProduced, 0)) AS Q, --Q= Tok/Tp 
    ((DATEDIFF(n, sm.SR_StartTime, isnull(sm.SR_EndTime, GETDATE())) - isnull(dt.DownTimeDuration, 0))/DATEDIFF(n, sm.SR_StartTime, isnull(sm.SR_EndTime, GETDATE()))) AS A, 
    ((isnull(sm.SR_BDT, 1) * isnull(p.TotalProduced, 0))/(DATEDIFF(n, sm.SR_StartTime, isnull(sm.SR_EndTime, GETDATE())) - isnull(dt.DownTimeDuration, 0))) AS P, 
    (((isnull(p.TotalProduced, 0) - isnull(s.Scrap, 0))/isnull(p.TotalProduced, 0)) * ((DATEDIFF(n, sm.SR_StartTime, isnull(sm.SR_EndTime, GETDATE())) - isnull(dt.DownTimeDuration, 0))/DATEDIFF(n, sm.SR_StartTime, isnull(sm.SR_EndTime, GETDATE())))*((isnull(sm.SR_BDT,1)*isnull(p.TotalProduced,0))/(DATEDIFF(n,sm.SR_StartTime,isnull(sm.SR_EndTime,GETDATE()))-isnull(dt.DownTimeDuration,0)))) AS OEE 
FROM 
    ShiftReportMaster sm 
LEFT JOIN 
    (SELECT 
     SH_ShiftID, Sum(SH_Produced) AS TotalProduced 
    FROM 
     ShiftHourCounts 
    GROUP BY 
     SH_ShiftID) p ON (p.SH_ShiftID = sm.SR_ID) 
LEFT JOIN 
    (SELECT 
     SRS_SR_ID, SRS_PartID, Sum(SRS_Scraped) AS Scrap 
    FROM 
     ShiftReportScrap 
    GROUP BY 
     SRS_SR_ID, SRS_PartID) s ON (s.SRS_SR_ID = sm.SR_ID) 
            AND (s.SRS_PartID = sm.SR_PartID) 
LEFT JOIN 
    (SELECT 
     srd.DTR_SRID, [Downtime reasons].DT_Planned, 
     Sum(srd.DTR_DownTimeDuration) AS DownTimeDuration 
    FROM 
     ShiftReportDowntime srd 
    LEFT JOIN 
     [Downtime reasons] ON srd.DTR_Reason = [Downtime reasons].DT_ID 
    GROUP BY 
     srd.DTR_SRID, [Downtime reasons].DT_Planned 
    HAVING 
     ((([Downtime reasons].DT_Planned) = 0))) dt ON (dt.DTR_SRID = sm.SR_ID) 
WHERE 
    sm.SR_ID = 3689; 

sample data and result

答えて

1

ほとんどの場合。これを試してみてください:

((isnull(p.TotalProduced+.0,0.0)-isnull(s.Scrap+.0,0.0)) 
/nullif(p.TotalProduced,0)) AS Q, --Q= Tok/Tp 

.0を追加またはimplictly 1.0を掛けるdecimal型に整数に変換します。

整数を分割すると整数型が返され、その値が1より小さい場合は、丸めや整数を返す代わりに切り捨てるため、0が返されます。

+1

私は同じことを考えていましたが、除数のISNULLは信じられないほど恐ろしいです。 p.TotalProducedがnullの場合、これはゼロ除算エラーを引き起こします。 –

+0

@SeanLangeそれは本当です。私は元のコードから 'p.TotalProduced'が0の場合に' 0'の代わりに 'null'を返すように変更しました。 – SqlZim

+0

そのトリックはあなたに感謝しました!また、0キャッチによる除算にも感謝します。 – argent65