2013-08-21 5 views
-3

Я пытаюсь преобразовать следующий запрос Crosstab Access для работы в SQL Server 2008 (который не поддерживает Transform & Pivot). Любая помощь будет принята с благодарностью.Преобразование MS Access Crosstab в SQL Server 2008

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"); 

Спасибо.

Если тест выполняется несколько раз, могу ли я извлечь последний результат Fail_code для каждого (test_1, Test_2 ... ect) на основе максимальной даты? У меня есть поле 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 

Вот текущий результат, когда я запускаю SQL, предоставленный пользователем bluefeet.

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 anf 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 
+2

SQL2008 действительно поддерживает PIVOT –

+0

Я отбросил изменения к этому вопросу, пожалуйста, разместите новый вопрос с новыми требованиями. [Задать вопрос здесь] (http://stackoverflow.com/questions/ask) – Taryn

+2

@JimA please ** [сделать новый вопрос] (http://stackoverflow.com/questions/ask) **, не изменять это один. –

ответ

3

SQL Server поддерживает PIVOT только не с синтаксисом ТРАНСФОРМ, ваш запрос будет похож на следующее:

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, MAX, AVG, 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; 

Посмотреть Demo

После последнего изменения со временем включен в день вы должны быть в состоянии использовать:

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; 

См Demo

+0

Спасибо ... Это работает !!! –

+0

@JimA Правильно, вот как вы пишете PIVOT. «Test_1» и т. Д. - значения, которые будут преобразованы в столбцы. – Taryn

+0

@JimA. Если у вас есть новый вопрос, вы должны отправить новый вопрос с этими деталями и требованиями. – Taryn

Смежные вопросы