• ベストアンサー

アクセスでの抽出条件について

たとえば、小売店のデータベースで、1お客様テーブル2商品テーブル3売上リストがあったとして。 お客様全員のリストに、一個の特定した商品を持っている人には1、その他の数字、ない人はスペースというクエリをさくせいできますか? とにかくお客様は全員表示させたいのですが

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

  • ベストアンサー
  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.3

無い人は0でよければ簡単ですよ お客様テーブルに売上リストを外部結合させます 結合の種類は[お客様テーブルの全レコードを・・・] お客様テーブルのお客様フィールドを取り出し IIf(商品=特定の商品,1,0) という式フィールドを作り、集計クエリに変えて この式の合計を求めます どうしてもスペースにしたければもう一段クエリを組んでください

その他の回答 (3)

noname#60992
noname#60992
回答No.4

売り上げリストを特定の商品で選択して、 お客様のIDでグループ化し、カウントをとるクエリを作ります。 最初のクエリをお客様テーブルにright joinさせるクエリを作ります。 (結合プロパティでお客様テーブルの全レコードとグループ化した クエリの同じ結合フィールドのレコードだけを含めるとする) データが存在しない場合はブランクが表示されます。

noname#140971
noname#140971
回答No.2

補足: DCount関数でもOK! ただし、DCount関数は実行速度が3倍程度になります。

noname#140971
noname#140971
回答No.1

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

関連するQ&A