MS Access Group使用日期时中断

时间:2013-03-19 16:46:10

标签: date ms-access group-by

由于某些原因,在Access 2010中使用分组依据的选择查询中使用日期/时间字段(记录未正确“按”分组“文本字段”,多次显示相同的“aTextField”值)。我能够在一个简单的一个表查询中复制该问题。例如:

SELECT aTextField, SUM(aIntField) AS SumOfaIntField
FROM simpleTable
GROUP BY aTextField, aDateField
HAVING aDateField >= Date()
ORDER BY aTextField;

只要从查询中删除“aDateField”(Group By和Having行),它就能正常工作。我甚至可以移除HAVING线并且它仍然会断裂。让我相信它与Group By有关。

任何反馈都会很棒。谢谢!

编辑更多详情

**simpleTable**
--------------------------------------------
| ID | aTextField | aIntField | aDateField |
============================================
|  1 | John Doe   |         1 |  3/14/2013 |
|  2 | John Doe   |           |  3/15/2013 |
|  3 | Jane Doe   |         1 |  3/15/2013 |
|  4 | John Doe   |         2 |  3/18/2013 |
|  5 | Jane Doe   |         1 |  3/19/2013 |
|  6 | John Doe   |           |  3/20/2013 |
|  7 | John Doe   |         3 |  3/21/2013 |
|  8 | Jane Doe   |         1 |  3/19/2013 |
|  9 | John Doe   |           |  3/22/2013 |
| 10 | Jane Doe   |         2 |  3/20/2013 |
| 11 | Jane Doe   |           |  3/21/2013 |
| 12 | Jane Doe   |           |  3/22/2013 |
--------------------------------------------

**Expected Result**
-------------------------------
| aTextField | SumOfaIntField |
===============================
| Jane Doe   |              4 |
| John Doe   |              3 |
-------------------------------

**Actual Result**
-------------------------------
| aTextField | SumOfaIntField |
===============================
| Jane Doe   |              2 |
| Jane Doe   |              2 |
| Jane Doe   |                |
| Jane Doe   |                |
| John Doe   |                |
| John Doe   |              3 |
| John Doe   |                |
-------------------------------

所以似乎正在发生的事情是每个日期也有一个单独的行。我只需按日期过滤,而不一定按分组过滤。但是,Access不会在不对其进行分组的情况下接受查询。选项?

3 个答案:

答案 0 :(得分:2)

您按aTextFieldaDateField进行分组。也许simpleTable包括日期相同的行,但是时间不同。在这种情况下,您的分组会为每个日期/时间组合生成一行。

无论是否是解释,您应该通过在aDateField列表中包含SELECT来检查数据库引擎实际评估的内容。

SELECT aTextField, aDateField, SUM(aIntField) 
FROM simpleTable
GROUP BY aTextField, aDateField
HAVING aDateField >= Date()
ORDER BY aTextField;

另请考虑使用WHERE代替HAVING子句:

WHERE aDateField >= Date()

根据您的样本数据,我怀疑您想......

SELECT aTextField, SUM(aIntField) 
FROM simpleTable
GROUP BY aTextField
WHERE aDateField >= Date()
ORDER BY aTextField;

答案 1 :(得分:1)

您应该可以使用以下内容:

SELECT aTextField, SUM(aIntField) AS SumOfaIntField
FROM simpleTable
WHERE aDateField >= Date()
GROUP BY aTextField
ORDER BY aTextField;

您会注意到我删除了GROUP BY列上的aDateField。由于您需要每个aTextField的总计,因此您无需按日期分组。按日期分组将为每个不同的日期生成单独的行。

注意:此查询已在MS Access 2010中进行了测试,并生成了所需的结果。

答案 2 :(得分:0)

我认为你对GROUP BY如何运作有误解。对于每个唯一的文本字段/日期时间组合,您应该看到相同的aTextField

<强>示例

a 2012-01-01
a 2012-01-01
b 2012-01-01
b 2012-01-02
b 2012-01-02

分组由aTextField,aDateField

组成
a 2012-01-01
b 2012-01-01
b 2012-01-02

按aTextField分组

a
b