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

Posted

技术标签:

【中文标题】基于包含子查询的查询的 ms-access 交叉表查询【英文标题】:ms-access crosstab query based on a query containing a subquery 【发布时间】:2013-09-19 08:56:29 【问题描述】:

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

所以,查询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 函数或等效的子查询具有相当的性能......

【问题讨论】:

您是否尝试将 mainMeas 查询的内容直接移动到交叉表查询中? 嗨@DHW,感谢您帮助我!我已经尝试了您的建议(即我对它的理解:基本上用 TestqryMeasurement 的那些替换交叉表查询的 SELECT 和 FROM 子句并进行必要的调整)。不幸的是,我仍然收到相同的错误消息! 抱歉 - 我不在 Access 中,因此无法为您输入有效的查询。但是试试这个.. #1:创建一个包含三个字段(idTest、idMovement 和 MeasDate)的查询。按两个 id 字段分组,并最小 MeasDate 字段。将此查询称为“SubMeas”。 #2 创建一个新查询,将 tblMeasurement 和 SubMeas 作为表添加到查询中。使用 idTest 和 idMovement 字段连接这两个表。添加您需要的所有 tblMeasurement 字段,并添加 MinOfMeasDate 字段。您现在应该能够将此查询更改为交叉表类型查询并获得您想要的结果。 @DHW 是的!这就是解决方案,通过将查询与自身的子集连接来避免子查询。整齐又不失表演!巧妙地完成了,非常感谢!你想发布答案还是更喜欢我自己写? 你继续 - 这是一种很好的做法,以便其他人可以看到解决方案。 【参考方案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!

【讨论】:

以上是关于基于包含子查询的查询的 ms-access 交叉表查询的主要内容,如果未能解决你的问题,请参考以下文章

TSQL 等效于 MS Access 交叉表查询

查询不会更新子窗体 MS-Access 中的表

重新链接表后重新查询表单

MySQL数据库多表查询

MySQL数据库多表查询

mysql连接查询,子查询,联合查询