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

解決済みの質問

クエリ式でDcount の代わりは?

クエリでわからないことがあります。

添付図のように、商品IDに対する部門IDの個数(または有無)を調べたいと思って、

部門1: DCount("[部門ID]","[T_部門]","[商品ID]=" & [T_商品情報].[商品ID] & "and [部門ID]=1")
部門2: DCount("[部門ID]","[T_部門]","[商品ID]=" & [T_商品情報].[商品ID] & "and [部門ID]=2")

と、[Q_発注管理]のクエリ式に入れてカウントはできたのですが、重くなってしましました。
このような場合、簡単に下記のような結果を得られるような方法はないでしょうか?

※ 今のところ、[Q_発注管理]は、選択クエリです。、
※ [T_商品情報]と[Q_発注管理]のレコード数(6万くらい)は同じになります。
※ 部門1(部門2)は、個数でなく、有無(True,False)でもいいです。

投稿日時 - 2011-12-24 13:50:06

QNo.7206756

困ってます

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

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倍速ですよ。

投稿日時 - 2011-12-24 14:42:17

ANo.1

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

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

回答(2)

ANo.2

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;

だと?
もし上記で結果が得られたなら後学のため大体の処理時間を教えてくださいませ。

投稿日時 - 2011-12-25 15:10:05

あなたにオススメの質問