Создание итоговых строк T-SQL - PullRequest
0 голосов
/ 14 июля 2010

У меня есть данные в таблице, которая выглядит следующим образом:

 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 и определить, прошел он или нет. Обычно для каждой части есть несколько записей.

В одном тесте необходимо определить состояние детали или то, был ли последним результатом теста PASS или FAIL, игнорируя такие данные, как «TEST ABORTED» или «Tab Calibration Factor Too High».

Второй тест должен определить качество детали, и критерии, которые мы используем для этого, должны проверить, прошла ли деталь в первом тесте, снова игнорируя ошибочные данные, такие как «TEST ABORTED» или «Camera Calibration». Фактор слишком высокий '.

Мне кажется, что мне нужно создать что-то, что выберет отдельный серийный номер, а затем написать цикл 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 (Serial_Number=@serialNum) 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<CharIndex('fail', @testResult)) then 'FAIL'
            when (0<CharIndex('pass', @testResult)) then 'PASS'
            else ''
        end
    end
    close resultList
    select @serialNum as 'Serial_Number', @result as 'Test_Result'
    fetch next from snList into @serialNum
end
close snList

Конец файла.

1 Ответ

2 голосов
/ 14 июля 2010

Вот мое лучшее предположение о том, что вы пытаетесь сделать. Помимо использования запроса, подобного этому, мое следующее предложение - нанять кого-то, кто знает 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%') .

В этом решении может возникнуть проблема, если два результата «пройдено / не пройдено» имеют одинаковое точное значение date_time. Вероятно, это будет проблемой для любого решения, если только вы не решите, как с этим справиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...