2

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

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

一旦您从查询中删除“aDateField”(分组依据和有行),它就会正常工作。我什至可以删除 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 不会接受不分组的查询。选项?

4

3 回答 3

2

您按aTextField和分组aDateField。可能simpleTable包括日期相同但时间不同的行。在这种情况下,您的分组将为每个日期/时间组合生成一行。

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

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;
于 2013-03-19T16:53:14.400 回答
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 中进行了测试,并生成了您想要的结果。

于 2013-03-19T18:11:49.897 回答
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
于 2013-03-19T16:51:52.040 回答