0

パーツのSerial_Numberを使用して要約を表示するために、JOINを使用して作成したクエリがあります。

明らかに、それは機能しません!

ここで直接検索を使用する:

select Serial_Number, Op_ID, Date_Time as 'DecayDate', 
    DECAY.System_ID AS 'DecayID', Test_Result as 'DecayResult' 
from Test_Results
where serial_number='CP21295 1006 09' and system_id like '%decay%'

このサンプル出力を取得します。

Serial_Number     Op_ID   DecayDate               DecayID      DecayResult
CP21295 1006 09   003468  2009-10-15 06:36:13.643 AA_DECAY_6   FAILED
CP21295 1006 09   003468  2009-10-05 08:08:38.503 AA_DECAY_6   PASSED

結果が必要なこの1つの部品番号に対して2つのテストがあったことに注意してください。

ここで、私が作成した、機能しないクエリについて説明します。


この最初のバージョンは、1つのレコードを返します

SELECT LABEL.Serial_Number, 
  DECAY.Op_ID,
  DECAY.Date_Time AS 'DecayDate',
  DECAY.System_ID AS 'DecayID',
  CASE
    WHEN DECAY.Test_Result LIKE '%fail%' THEN 'FAIL'
    WHEN DECAY.Test_Result LIKE '%pass%' THEN 'PASS'
    ELSE NULL
  END AS 'DecayResult'
  FROM 
  ACP_Parts AS LABEL
  LEFT OUTER JOIN (
    SELECT I.Serial_Number, I.Op_ID, I.Date_Time, I.System_ID, I.Test_Result
        FROM Test_Results I
    LEFT OUTER JOIN Test_Results O ON (
        I.Serial_Number=O.Serial_Number) AND 
        (O.Date_Time<I.Date_Time) -- AND (O.Serial_Number IS NULL) // didn't work
    WHERE
        (I.Test_Result LIKE '%pass%' OR I.Test_Result LIKE '%fail%') AND 
        (I.System_ID like '%decay%') AND
        (O.Test_Result LIKE '%pass%' OR O.Test_Result LIKE '%fail%') AND
        (O.System_ID like '%decay%')
    ) AS DECAY ON 
        (LABEL.Serial_Number=DECAY.Serial_Number) AND 
        (LABEL.Date_Time<DECAY.Date_Time)
  WHERE 
    (LABEL.Serial_Number IN (
        SELECT DISTINCT Serial_Number 
        FROM ACP_Parts 
        WHERE (Serial_Number IS NOT NULL) AND 
         (DATEADD(yy, - 1, GETDATE()) < Date_Time)))

出力

Serial_Number     DecayOp DecayDate               DecayID              DecayResult
CP21295 1006 09   003468  2009-10-15 06:36:13.643 AA_DECAY_6           PASS 

比較するレコードが2つ以上あるため、上記のクエリで結果が生成されると思います。右?


最新のレコードを返すことを期待して上記のクエリを変更しましたが、このバージョンでは何も返されません。

SELECT LABEL.Serial_Number, 
  DECAY.Op_ID,
  DECAY.Date_Time AS 'DecayDate',
  DECAY.System_ID 'DecayID',
  CASE
    WHEN DECAY.Test_Result LIKE '%fail%' THEN 'FAIL'
    WHEN DECAY.Test_Result LIKE '%pass%' THEN 'PASS'
    ELSE NULL
  END AS 'DecayResult'
  FROM 
  ACP_Parts AS LABEL
  LEFT OUTER JOIN (
    SELECT TOP 1 Serial_Number, Op_ID, Date_Time, System_ID, Test_Result
    FROM Test_Results
    WHERE
      (System_ID like '%decay%') AND
      (Test_Result LIKE '%pass%' OR Test_Result LIKE '%fail%')
    ORDER BY Date_Time DESC
    ) AS DECAY ON 
        (LABEL.Serial_Number=DECAY.Serial_Number) AND 
        (LABEL.Date_Time<DECAY.Date_Time)
  WHERE 
    (LABEL.Serial_Number IN (
        SELECT DISTINCT Serial_Number 
        FROM ACP_Parts 
        WHERE (Serial_Number IS NOT NULL) AND 
         (DATEADD(yy, - 1, GETDATE()) < Date_Time)))

出力

Serial_Number     DecayOp DecayDate               DecayID              DecayResult
CP21295 1006 09   NULL    NULL                    NULL                 NULL

誰かがこのクエリを取得して、私が求めている単一の結果を返す方法を指摘できますか?

4

2 に答える 2

0

各パーツの最新のtest_resultレコードが必要だと思いますか?

MSSQL 2005以降を使用していると仮定すると、MSDNドキュメントのROW_NUMBER()OVER(PARTITION BY ... ORDER BY ...)を確認してください。

于 2010-07-16T21:24:24.077 に答える
0

OK、コードを微調整して目的の結果を生成する方法を見つけました。

まず、私が使用したデータは次のとおりです。

CREATE TABLE JP1 (Serial_Number VarChar(20), Date_Time DateTime, Test_Result VarChar(255))
INSERT JP1 VALUES ('T900 09', '2009-10-10 01:15:00.000', 'NO TEST, Failed to Dump')
INSERT JP1 VALUES ('T901 09', '2009-10-10 01:20:00.000', '(BLUE) PASS (WHITE) FAIL')

CREATE TABLE JP2 (Serial_Number VarChar(20), Date_Time DateTime, Test_Result VarChar(255))
INSERT JP2 VALUES ('T900 09', '2009-10-15 01:15:00.000', 'NO TEST, Failed to Dump')
INSERT JP2 VALUES ('T900 09', '2009-10-15 02:15:00.000', '(BLUE) PASS (WHITE) FAIL')
INSERT JP2 VALUES ('T900 09', '2009-10-15 04:25:00.000', 'TEST ABORTED')
INSERT JP2 VALUES ('T900 09', '2009-10-15 04:59:00.000', '(BLUE) FAIL (WHITE) FAIL')
INSERT JP2 VALUES ('T900 09', '2009-10-15 05:09:00.000', '(WHITE) NO TEST')
INSERT JP2 VALUES ('T900 09', '2009-10-15 05:34:00.000', 'B=Pass.,W=FAIL, Final Fill')
INSERT JP2 VALUES ('T900 09', '2009-10-15 06:06:00.000', 'PASSED PD')
INSERT JP2 VALUES ('T900 09', '2009-10-15 06:30:00.000', 'TEST ABORTED')
INSERT JP2 VALUES ('T900 09', '2009-10-15 06:36:00.000', 'PASS')
INSERT JP2 VALUES ('T900 09', '2009-10-15 06:50:00.000', 'FAIL')
INSERT JP2 VALUES ('T900 09', '2009-10-05 08:08:00.000', 'NO TEST, Operator cancel')

次に、非常によく似た2つのクエリを作成しました。結局のところ、私が条項で述べた要件は、LEFT OUTER JOIN条項で模倣する必要がありますWHERE

FIRSTPASSの結果と日付を抽出する方法は次のとおりです。

SELECT LABEL.Serial_Number, 
    DECAY.Date_Time AS 'DecayDate',
    CASE
    WHEN DECAY.Test_Result LIKE '%fail%' THEN 'FAIL'
    WHEN DECAY.Test_Result LIKE '%pass%' THEN 'PASS'
    ELSE NULL
    END AS 'DecayResult'
FROM JP1 AS LABEL
LEFT OUTER JOIN (
    SELECT I.Serial_Number, I.Date_Time, I.Test_Result
    FROM
        JP2 AS I
        LEFT OUTER JOIN JP2 AS O
        ON
        (I.Serial_Number=O.Serial_Number) AND
        ((O.Test_Result LIKE '%pass%') OR (O.Test_Result LIKE '%fail%')) AND -- //Gets First Test!
        (O.Test_Result NOT LIKE '%NO TEST%') AND
        (O.Date_Time<I.Date_Time) -- //(selects FIRST pass or fail)
        -- (I.Date_Time<O.Date_Time) -- //(selects LAST pass or fail)
    WHERE
        (I.Test_Result LIKE '%pass%' OR I.Test_Result LIKE '%fail%') AND -- //Gets First Test!
        (I.Test_Result NOT LIKE '%NO TEST%') AND
        (O.Serial_Number IS NULL)
) AS DECAY ON 
(LABEL.Serial_Number=DECAY.Serial_Number) AND 
(LABEL.Date_Time<DECAY.Date_Time)
WHERE 
(LABEL.Serial_Number IN (
    SELECT DISTINCT Serial_Number 
    FROM JP1
    WHERE (Serial_Number IS NOT NULL) AND 
    (DATEADD(yy, - 1, GETDATE()) < Date_Time))
)

FIRSTテストの結果と日付を抽出する方法は次のとおりです。

SELECT LABEL.Serial_Number, 
    DECAY.Date_Time AS 'DecayDate',
    CASE
    WHEN DECAY.Test_Result LIKE '%fail%' THEN 'FAIL'
    WHEN DECAY.Test_Result LIKE '%pass%' THEN 'PASS'
    ELSE NULL
    END AS 'DecayResult'
FROM JP1 AS LABEL
LEFT OUTER JOIN (
    SELECT I.Serial_Number, I.Date_Time, I.Test_Result
    FROM
        JP2 AS I
        LEFT OUTER JOIN JP2 AS O
        ON
        (I.Serial_Number=O.Serial_Number) AND
        ((O.Test_Result LIKE '%pass%') AND (O.Test_Result NOT LIKE '%fail%')) AND -- //Gets First Pass!
        (O.Test_Result NOT LIKE '%NO TEST%') AND
        (O.Date_Time<I.Date_Time) -- //(selects FIRST pass or fail)
        -- (I.Date_Time<O.Date_Time) -- //(selects LAST pass or fail)
    WHERE
        (I.Test_Result LIKE '%pass%' AND I.Test_Result NOT LIKE '%fail%') AND -- //Gets First Pass!
        (I.Test_Result NOT LIKE '%NO TEST%') AND
        (O.Serial_Number IS NULL)
) AS DECAY ON 
(LABEL.Serial_Number=DECAY.Serial_Number) AND 
(LABEL.Date_Time<DECAY.Date_Time)
WHERE 
(LABEL.Serial_Number IN (
    SELECT DISTINCT Serial_Number 
    FROM JP1
    WHERE (Serial_Number IS NOT NULL) AND 
    (DATEADD(yy, - 1, GETDATE()) < Date_Time))
)

他の人がこれが役立つことを願っています!

〜ジョー

于 2010-07-20T15:16:23.170 に答える