2010-07-14 121 views
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. 

我需要創建幾個腳本通過所有的記錄對於給定的序列號,並確定如果它通過或失敗。每個零件通常有多個條目。

一個測試需要確定部件的狀態,或者最後一個測試結果是PASS還是FAIL,忽略諸如'TEST ABORTED'或'Chamber Calibration Factor Too High'之類的數據。

第二個測試需要確定零件的質量,我們使用的標準是檢查零件是否在第一個測試中通過,再次忽略錯誤的數據,如'TEST ABORTED'或'Chamber校準因子太高「。

我覺得我需要創建一些選擇不同序列號的東西,然後編寫一個迭代數據的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<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

向我們展示樣品輸出請... – gbn 2010-07-14 16:43:29

+2

YIKES!遊標.......甚至沒有定義爲FAST_FORWARD ...... – 2010-07-14 16:47:00

+1

你也沒有命令你的內部遊標,這意味着如果有兩個結果,那麼輸出是未定義的 - 它可能是通過或它可能會失敗。確認!我也注意到,如果有一個結果是你不關心的,它可以將結果設置爲「'而不管訂購。 – 2010-07-14 17:15:15

回答

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%'更好)。

如果以相同的確切日期時間值通過兩次合格/不合格結果,此解決方案可能會有問題。儘管除非您決定如何處理這個問題,否則這可能會成爲任何解決方案的問題。

+0

Date_Time參數被記錄到千分之一秒,是員工必須運行的手動測試。在我們所有的記錄中,我認爲我們沒有一個人拿出重複的時間戳。 雖然我很好奇,知道這是如何工作的。特別是最後一行:'TR2.serial_number IS NULL'這是如何拉*任何*記錄? – jp2code 2010-07-14 18:21:12

+0

由於TR2是通過左外連接的,所以該表被視爲別名。當創建左外連接時,如果在連接表中找不到匹配項,則其所有列都將返回爲NULL。假設serial_number是一個NOT NULL列,那麼TR2.serial_number可能爲NULL的唯一方法是在沒有找到匹配的情況下 - 意味着不存在具有相同序列號的行,通過或失敗結果,並且在晚於TR1的時間。如果是這種情況,則TR1必須是該序列號的最新通過/失敗行。 – 2010-07-14 18:59:42

+0

本示例使用最新的Date_Time值確定結果。 我該如何修改它以給出第一個PASS或第一個FAIL,但跳過其他? – jp2code 2010-07-14 19:17:40