2014-01-07 6 views
0

Поэтому у меня есть следующая таблица:MS Access - несколько запросов TRANSFORM?

Record ID  Test ID Test Type  Value Unit Passed Test 
1    1  Visual        1 
2    1  Earth Current 25   A  3 
3    1  Earth   0.07  Ohm  1 
4    1  Insulation  >99.99  MOhm 1 
5    1  Leakage   <0.1  mA  1 
6    1  Touch Leakage <0.1  mA  1 
7    1  Load   <0.05  kVA  3 
8    2  Visual        1 
9    2  Earth Current 25   A  3 
10    2  Earth   0.07  Ohm  1 
11    2  Insulation  >99.99  MOhm 1 
12    2  Leakage   <0.1  mA  1 
13    2  Load   <0.05  kVA  3 
14    2  Polarity       1 
15    3  Visual        1 
16    3  Earth Current 25   A  3 
17    3  Earth   0.16  Ohm  1 
18    3  Insulation  >99.99  MOhm 1 
19    3  Leakage   <0.1  mA  1 
20    3  Load   <0.05  kVA  3 
21    3  Polarity       1 

То, что я хочу сделать, это выбрать (с несколько присоединяется к другим таблицам) от этого, при использовании ТРАНСФОРМА для создания новых столбцов с помощью тестового типа, как заголовки. Этому я справился, но проблема связана с типами полярности и визуального тестирования; в основном для других типов тестов значение, которое я выбираю, должно быть из столбца Value, но для Polarity и Visual это должно быть из столбца Passed Test.

Затем мне также необходимо объединить устройство со значениями и заменить «1» или «3» на «PASS» и что-нибудь еще с «FAIL» для Polarity и Visual.

Так что мне нужно, чтобы в конечном итоге с чем-то вроде следующего:

Earth  Earth Current Insulation  Leakage Load  Polarity   Touch Leakage Visual 
          >99.99 MOhm  <0.1 mA <0.05 KVA PASS        PASS 
<0.04 Ohm 25A    >99.99 MOhm  <0.1 mA <0.05 KVA PASS        PASS 
0.07 Ohm 25A    >99.99 MOhm  0.31 mA <0.05 KVA PASS    <0.1   PASS 

Вот что я до сих пор:

TRANSFORM First([Value]) AS Result 

SELECT DISTINCT 
    Assets.Make, 
    Assets.Model, 
    Assets.[Asset ID], 
    [Asset Tests].[Test Date], 
    [Asset Tests].[Passed Test] 


FROM 
    (Assets 
INNER JOIN 
    [Asset Tests] 
ON 
    [Asset Tests].[Asset ID] = Assets.[Asset Key]) 
INNER JOIN 
    [Asset Test Records] 
ON 
    [Asset Test Records].[Test ID] = [Asset Tests].[Test ID] 

GROUP BY 
    [Asset Test Records].[Test ID], 
    Assets.Make, 
    Assets.Model, 
    Assets.[Asset ID], 
    [Asset Tests].[Test Date], 
    [Asset Tests].[Passed Test] 
ORDER BY 
    Assets.[Asset ID] 
PIVOT 
    [Test Type] 

Он смотрит на меня, как я, возможно, потребуется какое-кратное преобразование что происходит ... но я не знаю, с чего начать. Или я лаяю неправильное дерево?

Благодаря

EDIT: Я хотел бы добавить, что у меня нулевой контроль над входом, в противном случае все это дело было бы гораздо проще. Файл базы данных поступает так, и мне приходится иметь дело с ним.

+0

Я думаю, что я, вероятно, сначала создаю базовый запрос, чтобы создать новый столбец с именем «Output_value», который содержит логику «Iif» ([Тип теста] = «полярность» или [Тип теста] = «визуальный», [принят test], [value] & '' & [unit]). Затем закрепите свой опорный элемент в этом запросе с помощью First (Output_value) в качестве поля PIVOT. Обратите внимание, что ваш базовый запрос также должен содержать таблицу поиска, чтобы преобразовать 1 и 3 в fail/pass, как вам нужно. –

ответ

1

РЕДАКТИРОВАТЬ: Это можно сделать за один шаг, ответ, который я дал ниже, длинный, извините.

TRANSFORM First(IIf([test_type]="visual" Or [test_type]="polarity",[test_result_text],[test_value] & " " & [unit])) AS output_value 
SELECT tbl_Test.Test_ID 
FROM tbl_Test INNER JOIN lk_test_result ON tbl_Test.Test_Result = lk_test_result.test_result 
GROUP BY tbl_Test.Test_ID 
PIVOT tbl_Test.Test_Type; 

q_test_basis в моем исходном растворе может быть сделано в самой необходимости кросс без второго запроса, чтобы сидеть на нем. Извиняюсь за путаницу!

=== ОРИГИНАЛ РАСТВОР 2 СТАДИИ ===

Я импортировал данные и создали запросы, которые нужно. Обратите внимание, что имена полей не идентичны, но это описывает как логику, так и требуемую формулу.

Базовый запрос, чтобы сделать один столбец выходных значений с помощью логики, которую Вы определили:

SELECT tbl_Test.Record_ID, tbl_Test.Test_ID, tbl_Test.Test_Type, IIf([test_type]="visual" Or [test_type]="polarity",[test_result_text],[test_value] & " " & [unit]) AS output_value 
FROM tbl_Test INNER JOIN lk_test_result ON tbl_Test.Test_Result = lk_test_result.test_result; 

Это производит вывод так:

базы запрос q_test_basis затем используется как вход для запроса кросс-таблицы, определенного в стандартном wa у.

TRANSFORM First(q_test_basis.output_value) AS FirstOfoutput_value 
SELECT q_test_basis.Test_ID 
FROM q_test_basis 
GROUP BY q_test_basis.Test_ID 
PIVOT q_test_basis.Test_Type; 

Обратите внимание, что столбцы будут отсортированы в алфавитном порядке по test_type. Я также могу вставить скриншоты для дизайна запроса, если вам нужно, но я думаю, что это был только двухэтапный подход и условное поле, которое отсутствовало в вашем решении.

+0

С некоторой модификацией, подходящей для моих целей, я использовал решение в вашем редактировании. Благодаря :) –

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