-3

我正在尝试将以下 Access Crosstab 查询转换为在 SQL Server 2008(不支持 Transform & Pivot)中工作。任何帮助将不胜感激。

TRANSFORM Last(dbo_TBL_DM_TEST_RESULTS_Flex.FAIL_CODE) AS LastOfFAIL_CODE1
SELECT dbo_TBL_DM_TEST_RESULTS_Flex.SERIAL_ID
FROM dbo_TBL_DM_TEST_RESULTS_Flex
WHERE (((dbo_TBL_DM_TEST_RESULTS_Flex.TEST_DATE)>#7/1/2013 0:0:1#) AND ((dbo_TBL_DM_TEST_RESULTS_Flex.TEST_RESULT)="fail"))
GROUP BY dbo_TBL_DM_TEST_RESULTS_Flex.SERIAL_ID
PIVOT dbo_TBL_DM_TEST_RESULTS_Flex.TEST_AREA In ("Test_1","Test_2","Test_3","Test_4","Test_5","Test_6");

谢谢。

如果多次运行测试,我可以根据最大日期为每个(test_1,Test_2...ect)提取最后一个 Fail_code 结果吗?我有一个名为 TEST_DATE 的字段,我想提取每个测试的最后一条记录。如果测试通过或未运行,则字段 FAIL_CODE 将为 NULL。这是我想要进行透视的原始数据。

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_3    8/17/2013 10:13:41 PM  12398701   FAIL         Pwr_up
Test_3    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:34:34 AM  12398701   FAIL         Memory_1

这是我运行用户 bluefeet 提供的 SQL 时的当前结果。

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

正如您在原始数据中看到的那样——Test_3 和 Test_4 运行了两次。第二次运行 Test_3 和 Test_4 他们通过了,所以我不想报告第一次失败。这是我想要的输出。

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

1 回答 1

3

SQL Server 不支持PIVOT只是不使用 TRANSFORM 语法,您的查询将类似于以下内容:

select SERIAL_ID, Test_1, Test_2, Test_3, Test_4, Test_5, Test_6
from
(
    select SERIAL_ID, FAIL_CODE, TEST_AREA
    from dbo_TBL_DM_TEST_RESULTS_Flex
    where TEST_DATE> '2013-07-01' 
        AND TEST_RESULT='fail'
) d
pivot
(
    max(FAIL_CODE)
    for TEST_AREA in (Test_1, Test_2, Test_3, Test_4, Test_5, Test_6)
) piv;

SQL Server 不支持LAST()MS Access 使用的功能。您将需要使用 、 、 、 或 等的聚合MIN函数MAXAVG获得COUNT结果SUM

您的新要求不是很清楚,也没有明确的方法来确定哪一行较晚,因为您对每个条目都有相同的日期/时间,但您可以使用:

select SERIAL_ID, Test_1, Test_2, Test_3, Test_4, Test_5, Test_6
from
(
  select f1.SERIAL_ID, f1.FAIL_CODE, f1.TEST_AREA
  from dbo_TBL_DM_TEST_RESULTS_Flex f1
  where f1.TEST_DATE> '2013-07-01' 
    AND f1.TEST_RESULT='fail'
    and not exists (select test_area
                    from dbo_TBL_DM_TEST_RESULTS_Flex f2
                    where f2.TEST_DATE> '2013-07-01' 
                      and f2.TEST_RESULT<>'fail'
                      and f1.TEST_DATE = f2.TEST_DATE
                      and f1.TEST_AREA = f2.TEST_AREA)
) d
pivot
(
    max(FAIL_CODE)
    for TEST_AREA in (Test_1, Test_2, Test_3, Test_4, Test_5, Test_6)
) piv;

演示

在您最后一次编辑包含日期的时间后,您应该能够使用:

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'
) d
pivot
(
    max(FAIL_CODE)
    for TEST_AREA in (Test_1, Test_2, Test_3, Test_4, Test_5, Test_6)
) piv;

演示

于 2013-08-21T20:13:24.223 回答