聚合功能

时间:2013-11-25 16:14:42

标签: sql ms-access

我在MS ACCESS中写这个声明

SELECT tblTrades.Tick, Sum(tblBbgDivData.BBG_Div_Forecast) AS SumOfBBG_Div_Forecast, tblBbgDivData.Div_Declared_Date
FROM tblBbgDivData INNER JOIN tblTrades ON tblBbgDivData.Tick = tblTrades.Tick
GROUP BY tblTrades.Tick
HAVING (((tblBbgDivData.Div_Declared_Date) Between [tblTrades].[vd_off] And [tblTrades].[vd_on]));

- >您尝试执行不包含指定表达式“Div_Declared_Date”作为聚合函数的查询

我试图更改<>与之间,同样的事情!

3 个答案:

答案 0 :(得分:2)

您可以在下面突出显示您的问题。来自documentation

  

如果没有SQL聚合函数,则省略摘要值   SELECT语句。

     

GROUP BY字段中的空值被分组,不会被省略。   但是,在任何SQL聚合函数中都不会计算Null值。

     

使用WHERE子句排除不希望分组的行并使用   HAVING子句用于在记录分组后对其进行过滤。

     

除非它包含备注或OLE对象数据,否则GROUP BY中的字段   字段列表可以引用FROM中列出的任何表中的任何字段   子句,即使该字段未包含在SELECT语句中,   如果SELECT语句包含至少一个SQL聚合   功能。 Microsoft Access数据库引擎无法在Memo或组上进行分组   OLE对象字段。

     

SELECT字段列表中的所有字段都必须包含在   GROUP BY子句或作为SQL聚合的参数包含在内   功能

所以你的查询应该是:

SELECT tblTrades.Tick,
  Sum(tblBbgDivData.BBG_Div_Forecast) AS SumOfBBG_Div_Forecast,
  tblBbgDivData.Div_Declared_Date
FROM tblBbgDivData
INNER JOIN tblTrades
  ON tblBbgDivData.Tick = tblTrades.Tick
WHERE (((tblBbgDivData.Div_Declared_Date) BETWEEN [tblTrades].[vd_off] AND [tblTrades].[vd_on]));
GROUP BY tblTrades.Tick,tblBbgDivData.Div_Declared_Date

答案 1 :(得分:-2)

用于检查聚合列(聚合后)。所以如果你想知道tblBbgDivData.BBG_Div_Forecast的总和大于500,你会使用 HAVING SUM(tblBbgDivData.BBG_Div_Forecast) > 500

您需要将其移至where子句:

SELECT tblTrades.Tick, Sum(tblBbgDivData.BBG_Div_Forecast) AS SumOfBBG_Div_Forecast, tblBbgDivData.Div_Declared_Date
FROM tblBbgDivData INNER JOIN tblTrades ON tblBbgDivData.Tick = tblTrades.Tick
WHERE (((tblBbgDivData.Div_Declared_Date) Between [tblTrades].[vd_off] And [tblTrades].[vd_on]))
GROUP BY tblTrades.Tick
;

答案 2 :(得分:-2)

HAVING仅适用于aggrecate函数,以根据应用于每个组的公式限制结果。我想你想要WHERE

SELECT tblTrades.Tick, Sum(tblBbgDivData.BBG_Div_Forecast) AS SumOfBBG_Div_Forecast, tblBbgDivData.Div_Declared_Date
FROM tblBbgDivData INNER JOIN tblTrades ON tblBbgDivData.Tick = tblTrades.Tick
WHERE (((tblBbgDivData.Div_Declared_Date) Between [tblTrades].[vd_off] And [tblTrades].[vd_on]));
GROUP BY tblTrades.Tick

您的SELECT声明(tblBbgDivData.Div_Declared_Date)中还有一个不在oyur GROUP BY中的字段,因此您也需要按该字段进行分组或应用aggergation它呢