MS Access - 多个TRANSFORM查询?

时间:2014-01-07 23:20:41

标签: sql ms-access

所以我有下表:

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]

在我看来,我可能需要某种多变换的东西......但我不知道从哪里开始。还是我在错误的树上吠叫?

由于

编辑:我应该补充一点,我对输入没有控制权,否则这一切都会容易得多。数据库文件是这样的,我必须处理它。

1 个答案:

答案 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上按字母顺序排序。如果需要,我也可以粘贴查询设计的屏幕截图,但我认为这只是解决方案中缺少的两阶段方法和条件字段。