- ベストアンサー
クエリ式でDcount の代わりは?
- クエリでわからないことがあります。
- 部門IDの個数を調べたいと思っていますが、Dcount関数を使用していると処理が重くなってしまいます。
- 簡単に部門IDの個数や有無を調べる方法はないでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Q、簡単に下記のような結果を得られるような方法はないでしょうか? A、3倍速程度ならばDCount関数を自作。 DLookup()やDCount()は、少々重たいですね。それらと比較しての実行時間を30%程度まだ短縮するには自作という手があります。 Public Function DBCount(ByVal strField AS String, _ ByVal strTable As String, _ Optional ByVal strWhere AS String = "") 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 = Nz(.Fields(0), 0) End If End With Exit_DBCount: On Error Resume Next rst.Close Set rst = Nothing DBCount = N 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 <テーブル構造を見直すべきでは???> 普通は顧客区分とか商品の科目、品種に関する識別キーはそれぞれのマスターに記憶。そして、それをどのように表現するのかは「区分呼称管理テーブル」の役割り。このような設計であれば、そもそもDCount()、DBCount()の出番はないかと・・・。それが、10倍速への道。なお、SQL Server+Accessプロジェクトならば50倍速ですよ。
その他の回答 (1)
- nicotinism
- ベストアンサー率70% (1019/1452)
SELECT T_部門.商品ID, -Int(Sum([部門ID]=1)) AS 部門1, -Int(Sum([部門ID]=2)) AS 部門2 FROM T_部門 GROUP BY T_部門.商品ID; とか TRANSFORM cint(Nz(Count(QX.[数]),0)) AS 数のカウント SELECT QX.商品ID FROM ( SELECT [T_部門].商品ID, [T_部門].部門ID, Count([T_部門].部門ID) AS 数 FROM T_部門 GROUP BY [T_部門].商品ID, [T_部門].部門ID ) AS QX GROUP BY QX.商品ID PIVOT '部門' & QX.部門ID; だと? もし上記で結果が得られたなら後学のため大体の処理時間を教えてくださいませ。