0

うまく機能する次のクエリがありますが、ピボットの結果を変更できるかどうか知りたいと思っていました。

以下は、現在の出力のサンプルです。

SERIAL_ID  Test_1  Test_2  Test_3  Test_4  Test_5    Test_6
12398701   NULL    NULL    NULL    NULL    Memory_1  NULL

これが私の望ましい出力です。TEST_AREA が NULL で、TEST_RESULT = PASS または FAIL (レコードなし) を持たない場合は、INC を表示します。また、TEST_RESULT = PASS の場合は、NULL を PASS に置き換えます。以下の例 Test_3 と Test_6 は実行されませんでした (記録なし)

SERIAL_ID  Test_1  Test_2  Test_3  Test_4  Test_5    Test_6
12398701   PASS    PASS    INC     PASS    Memory_1  INC

変更が必要なクエリは次のとおりです。

select SERIAL_ID, Test_1, Test_2, Test_3, Test_4, Test_5, Test_6
from
(
  select SERIAL_ID, FAIL_CODE, TEST_AREA
  from
  (
    select f1.SERIAL_ID, f1.FAIL_CODE, f1.TEST_AREA, f1.TEST_RESULT,
      row_number() over(partition by f1.SERIAL_ID, f1.TEST_AREA
                        order by f1.TEST_DATE desc) seq
    from dbo_TBL_DM_TEST_RESULTS_Flex f1
    where f1.TEST_DATE> '2013-07-01' 
  ) d
  where seq = 1
    and (TEST_RESULT='fail' or TEST_RESULT='Pass') 
) d
pivot
(
    max(FAIL_CODE)
    for TEST_AREA in (Test_1, Test_2, Test_3, Test_4, Test_5, Test_6)
) piv;

データの例を次に示します。

TEST_AREA TEST_DATE              SERIAL_ID  TEST_RESULT  FAIL_CODE
Test_1    8/14/2013 11:29:24 AM  12398701   PASS         NULL
Test_2    8/17/2013 08:49:35 AM  12398701   PASS         NULL
Test_2    8/17/2013 10:15:38 PM  12398701   PASS         NULL
Test_4    8/17/2013 10:23:22 PM  12398701   FAIL         Pwr_up
Test_4    8/17/2013 10:24:22 PM  12398701   PASS         NULL
Test_5    8/18/2013 07:30:19 AM  12398701   FAIL         Pwr_up
Test_5    8/18/2013 07:34:34 AM  12398701   FAIL         Memory_1
4

1 に答える 1

0

これは、テスト結果/失敗コードが Pass、Null、Fail、Not Null のいずれかに依存します。少し強引ですが、ピボット内でできることは限られています。

select 
  serial_id, 
  IsNull(Test_1, 'INC') Test_1, 
  IsNull(Test_2, 'INC') Test_2,
  IsNull(Test_3, 'INC') Test_3,
  IsNull(Test_4, 'INC') Test_4,
  IsNull(Test_5, 'INC') Test_5,
  IsNull(Test_6, 'INC') Test_6
from (
  select
    serial_id,
    IsNull(fail_code, test_result) fail_code, -- propagate 'Pass' up
    test_area
  from (
    select
      f1.serial_id,
      f1.fail_code,
      f1.test_area,
      f1.test_result,
      row_number() over (
        partition by 
          f1.serial_id,
          f1.test_area
        order by
           f1.test_date desc
      ) seq
    from 
      dbo_tbl_dm_test_results_flex f1
    where
      f1.test_date > '2013-07-01' 
    ) d
  where 
    seq = 1 and 
    test_result in ('fail', 'Pass') 
  ) d
pivot (
    max(fail_code)
    for test_area in (Test_1, Test_2, Test_3, Test_4, Test_5, Test_6)
) piv;

Example Fiddle

于 2013-09-26T22:52:08.090 に答える