所以我有下表:
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
我想要做的是从中选择(与其他表的一些连接),同时使用TRANSFORM使用测试类型作为标题创建新列。我已经管理了很多,但问题在于极性和视觉测试类型;基本上对于其他测试类型,我选择的值需要来自Value列,但对于Polarity和Visual,它需要来自Passed Test列。
然后我还需要将Unit连接到值,并将“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]
在我看来,我可能需要某种多变换的东西......但我不知道从哪里开始。还是我在错误的树上吠叫?
由于
编辑:我应该补充一点,我对输入没有控制权,否则这一切都会容易得多。数据库文件是这样的,我必须处理它。
答案 0 :(得分: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阶段的原始解决方案===
我导入了您的数据并创建了您需要的查询。请注意,字段名称不相同,但这描述了逻辑和所需的公式。
Base Query使用您定义的逻辑创建单列输出值:
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
将用作交叉表查询的输入,以标准方式定义。
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
上按字母顺序排序。如果需要,我也可以粘贴查询设计的屏幕截图,但我认为这只是解决方案中缺少的两阶段方法和条件字段。