首页 文章

ms-访问基于包含子查询的查询的交叉表查询

提问于
浏览
0

我有一个基于包含子查询的查询的交叉表查询的问题 . 查询本身工作正常,但是当我在交叉表查询中使用它时,我收到与无法识别的字段名称相关的错误消息,并指向子查询中使用的字段 . 奇怪的是,我可以毫无困难地在此查询中定义数据透视表或数据透视表 .

所以,查询 TestqryMeasurement 的定义是:

SELECT *, 
    (SELECT min( subMeas.MeasDate ) FROM tblMeasurement AS subMeas 
     WHERE subMeas.idTest = mainMeas.idTest AND subMeas.idMovement = 
     mainMeas.idMovement) AS FirstMeasDate, 
    DateDiff("d",FirstMeasDate,MeasDate) AS DaysSinceFirstMeas
FROM tblMeasurement AS mainMeas;

它主要用于确定给定测试中给定运动的第一次测量和当前测量之间所花费的时间 . 运行此查询时,我得到了正确的结果 .

然后写入交叉表查询:

TRANSFORM Sum(TESTqryMeasurement.[Amplitude]) AS SumOfAmplitude
SELECT TESTqryMeasurement.[DaysSinceFirstMeas], 
    Sum(TESTqryMeasurement.[Amplitude]) AS [Total Of Amplitude]
FROM TESTqryMeasurement
GROUP BY TESTqryMeasurement.[DaysSinceFirstMeas]
PIVOT TESTqryMeasurement.[idMovement];

当我运行它时,我收到消息:

...数据库引擎无法将'mainMeas.idTest'识别为有效的字段名称或表达式

此字段仅用于 TestqryMeasurement 的子查询,它本身可以工作 .

任何的想法?

注意:我有Ms-Access v.14,是MS-Office 2010的一部分

  • 编辑 -

我通过VBA函数替换子查询来设置工作,该函数返回第一次测量的日期 . 尽管如此,该解决方案并不太好,因为交叉表查询的性能损失很大(有或没有计算字段) . 奇怪的是,查询本身具有与VBA函数或等效子查询相当的性能......

1 回答

  • 1

    答案是由@DHW给我的 . 这个想法是通过将查询与其自身的子集连接来完全避免子查询,该子集包含所需子查询的结果 . 这不仅有效,而且还避免了在调用自定义VBA函数替换子查询时遇到的性能损失 .

    就我而言,解决方案由下式给出:

    1)定义查询 - qryFirstMeasDate - 给出每个测试和移动的第一个测量日期:

    SELECT idTest, idMovement, min( MeasDate ) AS FirstMeasDate
    FROM tblMeasurement
    GROUP BY idTest, idMovement;
    

    2)将此查询与主测量表连接以获得整体测量查询 qryMeasurement

    SELECT tblMeasurement.*, FirstMeasDate, DateDiff("d",FirstMeasDate,MeasDate) AS   
       DaysSinceFirstMeas
    FROM tblMeasurement INNER JOIN qryFirstMeasDate ON 
       (tblMeasurement.idMovement = qryFirstMeasDate.idMovement) AND 
       (tblMeasurement.idTest = qryFirstMeasDate.idTest);
    

    3)在问题帖子中完成 qryMeasurement 上的交叉表查询 .

    再次感谢DHW!

相关问题