- ベストアンサー
アクセスでの抽出条件について
たとえば、小売店のデータベースで、1お客様テーブル2商品テーブル3売上リストがあったとして。 お客様全員のリストに、一個の特定した商品を持っている人には1、その他の数字、ない人はスペースというクエリをさくせいできますか? とにかくお客様は全員表示させたいのですが
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
無い人は0でよければ簡単ですよ お客様テーブルに売上リストを外部結合させます 結合の種類は[お客様テーブルの全レコードを・・・] お客様テーブルのお客様フィールドを取り出し IIf(商品=特定の商品,1,0) という式フィールドを作り、集計クエリに変えて この式の合計を求めます どうしてもスペースにしたければもう一段クエリを組んでください
その他の回答 (3)
売り上げリストを特定の商品で選択して、 お客様のIDでグループ化し、カウントをとるクエリを作ります。 最初のクエリをお客様テーブルにright joinさせるクエリを作ります。 (結合プロパティでお客様テーブルの全レコードとグループ化した クエリの同じ結合フィールドのレコードだけを含めるとする) データが存在しない場合はブランクが表示されます。
補足: DCount関数でもOK! ただし、DCount関数は実行速度が3倍程度になります。
Count関数を利用するのか?DBCount関数の類を作成するのか? 2つに1つです。 <Customer> ID__KName 1___鈴木 一郎 2___中村 主水 3___山田 太郎 <Goods> ID__GName 1___A 2___B <Uriage> ID__Hiduke_________Customer_ID__Goods_ID 1___2007/11/11_________________1____________1 2___2007/11/12_________________2____________1 3___2007/11/13_________________2____________2 <クエリ1> KName_______注文数 山田 太郎___0 中村 主水___2 鈴木 一郎___1 SELECT Customer.KName, Count(Goods.ID) AS 注文数 FROM Goods RIGHT JOIN (Customer LEFT JOIN Uriage ON Customer.ID=Uriage.Customer_ID) ON Goods.ID=Uriage.Goods_ID GROUP BY Customer.KName; Count関数を利用した場合、スペースでなくて0になります。 <クエリ2> KName______注文数 鈴木 一郎_________1 中村 主水_________2 山田 太郎 このクエリは次のようです。 SELECT KName, DBCount("*","URIAGE","Customer_ID=" & ID,"") AS 注文数 FROM Customer; <クエリ1>よりも<クエリ2>が、かなり、単純化されています。 DBCount("列名 or *","テーブル名","集計条件","戻り値") このように DBCount関数は、戻り値を指定できます。 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