3

このクエリは、人の姓を選択すると、すべてのテスト ケースで正常に機能します。

SELECT P.Patient_ID, P.Person_FirstName, P.Person_LastName
    , H.Height
    , W.Weight
    , CASE
        when  H.Height is not null then W.Weight / (H.Height * H.Height)
        else null
     END as BMI
FROM 
    VIEW_BillPatient P
    LEFT JOIN H on P.Patient_ID = H.Patient_ID
    LEFT JOIN W on P.Patient_ID = W.Patient_ID  

WHERE   
    P.Person_LastName = 'ZZtest'

これはnull、H.Height または W.Weight がの場合でも機能しnullます。

残念ながら、WHERE句を外して全員に対して実行しようとするとすぐに、0 による除算のエラーが発生します。

SELECT P.Patient_ID, P.Person_FirstName, P.Person_LastName
    , H.Height
    , W.Weight
    , CASE
        when  H.Height is not null then W.Weight / (H.Height * H.Height)
        else null
     END as BMI
FROM 
    VIEW_BillPatient P
    LEFT JOIN H on P.Patient_ID = H.Patient_ID
    LEFT JOIN W on P.Patient_ID = W.Patient_ID

エラー:

Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.

(サブクエリ H と W はそれぞれ、Patient_ID と、データベース内の身長または体重の最後の値を返します。通常は複数記録されているためです (見つからない場合は null)。式は、表示されている体格指数を計算することです。コード内)

私は何を間違っていますか?(MS SQL サーバー 2008-R2)

4

3 に答える 3

0

これを次のように変更します。

SELECT P.Patient_ID, P.Person_FirstName, P.Person_LastName
    , H.Height
    , W.Weight
    , CASE
        when  H.Height != 0 then W.Weight / (H.Height * H.Height)
        else null
     END as BMI
FROM 
    VIEW_BillPatient P
    LEFT JOIN H on P.Patient_ID = H.Patient_ID
    LEFT JOIN W on P.Patient_ID = W.Patient_ID

NULL != 0 はすでに false なので、その場合は null になりますが、0 の場合も null になります。

于 2013-09-20T20:15:49.323 に答える
0

あなたの問題は NULL 値ではなく、ゼロです。

で計算しようとするとNULL、 が返されNULLます。

代わりに、値がゼロの H.Height を除外する必要があります

WHEN H.Height>0 THEN ...
于 2013-09-20T20:13:43.803 に答える