代码之家  ›  专栏  ›  技术社区  ›  jp2code

创建T-SQL摘要行

  •  0
  • jp2code  · 技术社区  · 14 年前

     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.
    

    我需要创建几个脚本,遍历给定序列号的所有记录,并确定它是通过还是失败。每个零件通常有多个条目。

    一个测试需要确定零件的状态,或者上一个测试结果是通过还是失败,忽略诸如“测试中止”或“腔室校准系数过高”之类的数据。

    第二次测试需要确定零件的质量,我们使用的标准是检查零件是否通过第一次测试,再次忽略错误数据,如“测试中止”或“腔室校准系数过高”。

    我觉得我需要创建一些东西来选择不同的序列号,然后编写一个while循环来迭代数据。

    我有一些工作,但我目前没有办法让我返回的数据按日期\时间字段排序。

    如果我能弄明白那部分的话,我应该准备好了。

    有人能告诉我我可以做什么,让我的脚本在日期时间字段过滤?

    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 回复  |  直到 14 年前
        1
  •  2
  •   Tom H    14 年前

    这是我对你想做的最好的猜测。除了使用类似的查询之外,我的下一个建议是雇佣一个懂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
    

    没有光标和一条语句。左外连接基本上是查看是否有任何后续行具有相同序列号的通过或失败。如果没有,TR2.serial\u编号将为空,因此TR1行将是通过或失败的最新测试结果。

    如果您可以进一步约束通过/失败标准,那么这将是一个好主意,这样您就不会意外地使用错误的结果(例如,像“pass%”比像“%pass%”更好)。