我在基于包含子查询的查询的交叉表查询时遇到问题。查询本身工作正常,但是当我在交叉表查询中使用它时,我收到与无法识别的字段名称相关的错误消息,并指向子查询中使用的字段。奇怪的是,我可以毫不费力地在此查询中定义数据透视表或数据透视图。
因此,查询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函数或等效子查询相当的性能......
答案 0 :(得分: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!