0


0

T-SQLサマリー行の作成

次のサンプルデータのようなテーブルにデータがあります。

 varchar(20)    | DateTime               | varchar(20) |varchar(255)
_Serial_Number__|_Date_Time______________|_System_ID___|_Test_Result________________
C035993 0703 05 |2005-08-18 13:43:33.717 |VTI-Chamber1 | (BLUE) TEST ABORTED, LEAKFP SPUN DOWN
C035993 0702 05 |2005-08-18 13:51:52.640 |VTI-Chamber1 | FAIL: Squirt Test.
C035993 0704 05 |2005-08-18 14:18:13.607 |VTI-Chamber1 | TEST ABORTED
C035993 0705 05 |2005-08-18 14:30:43.717 |VTI-Chamber1 | B=FAIL, Final N2 Fill after Settle, W=PASS,
C035993 0707 05 |2005-08-18 14:41:59.310 |VTI-Chamber1 | FAIL: Fine Test.
C035878 0775 05 |2005-08-18 15:38:25.810 |VTI-Chamber1 | Chamber Calibration Factor Too High
C035878 0774 05 |2005-08-18 15:43:23.000 |VTI-Chamber1 | FAIL Pressure Decay Test
C035993 0674 05 |2005-08-18 15:51:49.467 |VTI-Chamber1 | FAIL: Squirt Test.
BLANKTEST       |2005-08-18 15:58:40.793 |VTI-Chamber3 | Pass.
C035993 0706 05 |2005-08-18 15:59:03.200 |VTI-Chamber1 | Pass.

いくつかのスクリプトを作成して、指定されたSerial_Numberのすべてのレコードを調べ、成功したか失敗したかを判断する必要があります。 通常、各パーツには複数のエントリがあります。

1つのテストでは、部品のステータス、または最後のテスト結果がPASSかFAILかを判断する必要があり、「TEST ABORTED」や「Chamber Calibration Factor Too High」などのデータは無視されます。

2番目のテストでは、部品の品質を判断する必要があります。そのために使用する基準は、最初のテストで部品が合格したかどうかを確認することです。「テスト中止」や「チャンバーキャリブレーション係数が高すぎる'。

個別のシリアル番号を選択するものを作成し、データを反復処理するwhileループを記述する必要があるように感じます。

動作するものはありますが、返されたデータをDate_Timeフィールドでソートする方法は現在ありません。

その部分を理解できたら、設定する必要があります。

スクリプトがDate_Timeフィールドでフィルター処理できるようにするためにできることを誰かが親切に見せてもらえますか?

declare @result varChar(10), @serialNum varChar(20), @testResult varChar(255)
declare snList cursor for
    select distinct TR.Serial_Number
    from Test_Results TR
    left join ACP_Parts AP on (TR.Serial_Number=AP.Serial_Number)
    where (AP.Serial_Number is not null)
open snList
fetch next from snList into @serialNum
while (@@fetch_status=0) begin
    set @result=''
    declare resultList Cursor for
        select Test_Result
        from Test_Results
        where ([email protected]) and (System_ID Like '%Chamb%')
    open resultList
    fetch next from resultList into @testResult
    while (@@fetch_status=0) and (@result<>'PASS') begin
        set @result=case
            when (0

ファイルの終わり。

1 Answer


2


あなたが何をしようとしているのか、これが私の最良の推測です。 これに似たクエリを使用する以外に、私の次の提案は、SQLを知っていてプログラミングの経験がある人を雇うか、自分でそれに慣れることです。

SELECT
    TR1.serial_number,
    CASE
        WHEN TR1.test_result LIKE '%pass%' THEN 'Pass'
        WHEN TR1.test_result LIKE '%fail%' THEN 'Fail'
        ELSE NULL
    END AS final_result
FROM
    Test_Results TR1
LEFT OUTER JOIN Test_Results TR2 ON
    TR2.serial_number = TR1.serial_number AND
    (
        TR2.test_result LIKE '%pass%' OR
        TR2.test_result LIKE '%fail%'
    ) AND
    TR2.test_date > TR1.test_date
WHERE
    (
        TR1.test_result LIKE '%pass%' OR
        TR1.test_result LIKE '%fail%'
    ) AND
    TR2.serial_number IS NULL

カーソルなしと単一のステートメント。 LEFT OUTER JOINは、基本的に、同じシリアル番号について、合格または不合格の後続の行があるかどうかを確認しようとしています。 存在しない場合、TR2.serial_numberはNULLになり、TR1行はそのため、合格または不合格の最新のテスト結果になります。

合格/不合格基準をさらに制限できる場合、誤った結果を誤って使用しないようにすることをお勧めします(たとえば、LIKE 'pass%'はLIKE '%pass%'よりも優れています)。

2つの合格/不合格の結果がまったく同じdate_time値で得られる場合、このソリューションには問題が生じる可能性があります。 ただし、どのように処理するかを決定しない限り、どのソリューションでも問題になる可能性があります。