- ベストアンサー
Access カウント
3種類の売上があるのですが売上0以外の数を数え業態でグループ化する場合 7つのクエリが必要だと思うのですが間違っていないでしょうか? 売上の抽出条件にnot 0指定したクエリを3つを作成します。 抽出クエリ1 抽出クエリ2 抽出クエリ3 このクエリから新たなクエリを作成しさらに業態でグループ化し売上をカウント指定します。 業態別カウントクエリ1 業態別カウントクエリ2 業態別カウントクエリ3 このクエリから新たなクエリを作成。 業態で結合、フィールドに各業態別売上カウント、業態名を設定。 グループ化したクエリに抽出条件を指定しても駄目だということに最近気づきました・・・。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
補足: 7つのクエリ方式と同じですよ。 DBLookup()では、3つの集計クエリを実行しているのと同じ。 3つのSELECT文は、その次の3つのクエリと同義。 最後の集計クエリは、SELECT文をUNION結合することで実現しています。 そういうことで、質問者のアプローチは基本的に回答3に同じです。 注意:UNIONを使ったクエリはSQLビューでSQL文をタイプすることで生成できます。
その他の回答 (4)
- CHRONOS_0
- ベストアンサー率54% (457/838)
原因は分かっておられるようですね >売上a 売上b 売上c こういうテーブルを扱うには 一度 >売上 >売上a >売上b >売上c >・ こういう形に組み替えてから扱えば、普通に扱えます 組み換えにはユニオンクエリを使います もちろんテーブルを作りかえるのが最良の方法ですよ
クエリ: 業態__売上件数a___売上件数b 売上件数c ____1______________2_______________2_____________1 ____2______________2_______________1_____________0 ____3______________0_______________1_____________1 テストでは、業態を1,2,3で格納しています。 が、こういうクエリ結果を得るには一つのクエリでOKです。 SELECT 業態, DBCount("売上_a", "売上履歴", "業態=1 AND 売上_a>0") AS 売上件数a, DBCount("売上_b", "売上履歴", "業態=1 AND 売上_b>0") AS 売上件数b, DBCount("売上_c", "売上履歴", "業態=1 AND 売上_c>0") AS 売上件数c FROM 売上履歴 WHERE 業態=1 UNION SELECT 業態, DBCount("売上_a", "売上履歴", "業態=2 AND 売上_a>0") AS 売上件数a, DBCount("売上_b", "売上履歴", "業態=2 AND 売上_b>0") AS 売上件数b, DBCount("売上_c", "売上履歴", "業態=2 AND 売上_c>0") AS 売上件数c FROM 売上履歴 WHERE 業態=2 UNION SELECT 業態, DBCount("売上_a", "売上履歴", "業態=3 AND 売上_a>0") AS 売上件数a, DBCount("売上_b", "売上履歴", "業態=3 AND 売上_b>0") AS 売上件数b, DBCount("売上_c", "売上履歴", "業態=3 AND 売上_c>0") AS 売上件数c FROM 売上履歴 WHERE 業態=3; 邪道と言えば邪道でしょうが、クエリを複雑化するよりも集計関数を自作すると言う手があります。 そうすれば、余り考えずに目で見たら判るクエリが書けると思います。 Public Function DBCount(ByVal strField As String, _ ByVal strTable As String, _ Optional ByVal strWhere As String = "", _ Optional ByVal ReturnValue = 0) As Variant On Error GoTo Err_DBCount Dim N Dim strQuerySQL As String Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset strQuerySQL = "SELECT COUNT(" & strField & ") FROM " & strTable If Len(strWhere) > 0 Then strQuerySQL = strQuerySQL & " WHERE " & strWhere End If With rst .Open strQuerySQL, _ CurrentProject.Connection, _ adOpenStatic, _ adLockReadOnly If Not .BOF Then .MoveFirst N = .Fields(0) End If End With Exit_DBCount: On Error Resume Next rst.Close Set rst = Nothing DBCount = IIf(N <> 0, N, ReturnValue) Exit Function Err_DBCount: MsgBox "SELECT 文の実行時にエラーが発生しました。(DBCount)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strQuerySQL, _ vbExclamation, " 関数エラーメッセージ" Resume Exit_DBCount End Function
- CHRONOS_0
- ベストアンサー率54% (457/838)
テーブルの説明無しにいきなりクエリ云々といわれても何のことかわかりませんよ 普通7つもクエリを重ねなきゃいけないなんてことにはなりませんね そのようになる原因として考えられる第一はテーブル設計ミスです ということでテーブルの情報が必須です
売上履歴: ID__区分___数量___金額 01__業態1_____1____\100 02__業態2_____2____\200 03__業態3_____3____\300 04__業態1____10__\1,000 05__業態2____20__\2,000 クエリ1: 売上件数___区分 __________2____業態1 __________2____業態2 __________1____業態3 SELECT Count(*) AS 売上件数 , 区分 FROM 売上履歴 GROUP BY 区分 ORDER BY 区分; このようにテーブル設計の関連部と目的のクエリを示されないと・・・。 読みようでは、単なる集計関数をGROUP BY 節とともにSELECT文と組み合わせて使う処理とも・・・。
補足
テーブル ID_売上a_売上b_売上c_業態 01_100__200____0__業態1 02_200_____0_____0__業態2 03____0__400__200__業態3 04_400__600_____0__業態2 05_500__700__300__業態1 クエリ結果 業態_売上件数a_売上件数b_売上件数c 業態1_2____________2_______1___ 業態2_2____________1_______0___ 業態3_0____________1_______1___ テーブルと最終的な結果を現すとこのような形です。 業態で結合すると0件の部分が消えてしまうので駄目ですね・・。 現状 業態_売上件数a_売上件数b_売上件数c 業態1_2__________2________1_____
補足
仰るとおりテーブル設計に問題があります。 売上 売上a 売上b 売上c ・ ・ とするところを 売上a 売上b 売上c としている所に問題があるようです。 テーブル設計を直すとなると時間がかかりますが 直したほうがよさそうですね。 最終結果を ID_売上a_売上b_売上_c としたいのでクロス集計で直す必要がありますね。 これは最終結果をAccessのレポートではなく Wordの差込印刷を使う関係上の問題と 売上a/売上bなどの計算する必要があるからです。