みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Access カウント

3種類の売上があるのですが売上0以外の数を数え業態でグループ化する場合
7つのクエリが必要だと思うのですが間違っていないでしょうか?
売上の抽出条件にnot 0指定したクエリを3つを作成します。
抽出クエリ1
抽出クエリ2
抽出クエリ3
このクエリから新たなクエリを作成しさらに業態でグループ化し売上をカウント指定します。
業態別カウントクエリ1
業態別カウントクエリ2
業態別カウントクエリ3
このクエリから新たなクエリを作成。
業態で結合、フィールドに各業態別売上カウント、業態名を設定。

グループ化したクエリに抽出条件を指定しても駄目だということに最近気づきました・・・。

投稿日時 - 2008-03-14 11:29:09

QNo.3861605

暇なときに回答ください

質問者が選んだベストアンサー

補足: 7つのクエリ方式と同じですよ。

DBLookup()では、3つの集計クエリを実行しているのと同じ。
3つのSELECT文は、その次の3つのクエリと同義。
最後の集計クエリは、SELECT文をUNION結合することで実現しています。
そういうことで、質問者のアプローチは基本的に回答3に同じです。

注意:UNIONを使ったクエリはSQLビューでSQL文をタイプすることで生成できます。

投稿日時 - 2008-03-15 06:45:55

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

原因は分かっておられるようですね
>売上a 売上b 売上c
こういうテーブルを扱うには
一度
>売上
>売上a
>売上b
>売上c
>・
こういう形に組み替えてから扱えば、普通に扱えます
組み換えにはユニオンクエリを使います
もちろんテーブルを作りかえるのが最良の方法ですよ

投稿日時 - 2008-03-15 11:45:46

クエリ:

業態__売上件数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

投稿日時 - 2008-03-14 15:51:23

ANo.2

テーブルの説明無しにいきなりクエリ云々といわれても何のことかわかりませんよ
普通7つもクエリを重ねなきゃいけないなんてことにはなりませんね
そのようになる原因として考えられる第一はテーブル設計ミスです
ということでテーブルの情報が必須です

投稿日時 - 2008-03-14 13:20:43

補足

仰るとおりテーブル設計に問題があります。
売上
売上a
売上b
売上c


とするところを
売上a 売上b 売上c
としている所に問題があるようです。
テーブル設計を直すとなると時間がかかりますが
直したほうがよさそうですね。
最終結果を
ID_売上a_売上b_売上_c
としたいのでクロス集計で直す必要がありますね。
これは最終結果をAccessのレポートではなく
Wordの差込印刷を使う関係上の問題と
売上a/売上bなどの計算する必要があるからです。

投稿日時 - 2008-03-14 14:04:29

売上履歴:

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文と組み合わせて使う処理とも・・・。

投稿日時 - 2008-03-14 11:52:47

補足

テーブル
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_____

投稿日時 - 2008-03-14 14:03:12

あなたにオススメの質問