2

何らかの理由で、Access 2010のGroupByを使用してselectクエリで日付/時刻フィールドを使用すると中断します(レコードは最初にテキストフィールドによって適切に「グループ化」されず、同じ「aTextField」値が複数回表示されます)。単純な1つのテーブルクエリで問題を再現できます。元:

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

クエリ(Group ByおよびHaving行)から「aDateField」を削除するとすぐに、正しく機能します。HAVINGラインを削除することもできますが、それでも壊れます。それはGroupByの何かであると私に信じさせてくれます。

どんなフィードバックも素晴らしいでしょう。ありがとう!

編集詳細

**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   |                |
-------------------------------

したがって、発生しているように見えるのは、日付ごとに個別の行もあるということです。日付でフィルタリングする必要があり、必ずしもGroupByである必要はありません。ただし、Accessは、クエリをグループ化せずに受け入れることはできません。オプション?

4

3 に答える 3

2

とでグループ化しaTextFieldていますaDateField。おそらくsimpleTable、日付は同じであるが時刻が異なる行が含まれています。その場合、グループ化により、日付と時刻の組み合わせごとに行が生成されます。

それが説明であるかどうかにかかわらずaDateFieldSELECTリストに含めることによって、dbエンジンが実際に何を評価するかを確認する必要があります。

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

GROUPBYがどのように機能するかについて誤解されていると思います。aTextField一意のテキストフィールド/日時の組み合わせごとに同じものが1回表示されるはずです

サンプル

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 に答える