- ベストアンサー
Accessのクエリーで商品コードを集計する方法
- Accessのクエリーを使用して、商品コードの集計を行う方法を教えてください。
- フィールド(商品コード,c0,c1,c2,c3,c4)に入っている値を元に、同じ商品コードの場合にc0~c4に入っているコードを集計したいです。
- 具体的な要件を満たすために、どのような構文を使用すればよいのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
1商品コードにつき、最大でc0~c4の5つしか収録できなくてもいいということならば、以下の通りできます。 ・サブクエリ1 まず、元レコードが集計に全く向いていないので、向いた形にします。 SELECT DISTINCT 商品コード, C FROM (SELECT 商品コード, c0 As C FROM TBL1 WHERE c0 IS NOT NULL UNION ALL SELECT 商品コード, c1 FROM TBL1 WHERE c1 IS NOT NULL UNION ALL SELECT 商品コード, c2 FROM TBL1 WHERE c2 IS NOT NULL UNION ALL SELECT 商品コード, c3 FROM TBL1 WHERE c3 IS NOT NULL UNION ALL SELECT 商品コード, c4 FROM TBL1 WHERE c4 IS NOT NULL) AS t; ・メインクエリ 上記サブクエリを使って以下のクエリを書きます。 SELECT 商品コード, MAX(IIF(SEQ=1,C,'')) AS c0, MAX(IIF(SEQ=2,C,'')) AS c1, MAX(IIF(SEQ=3,C,'')) AS c2, MAX(IIF(SEQ=4,C,'')) AS c3, MAX(IIF(SEQ=5,C,'')) AS c4 FROM (SELECT t1.商品コード, t1.C, (SELECT COUNT(*) FROM サブクエリ1 t2 WHERE t2.商品コード=t1.商品コード AND t2.C<=t1.C) AS SEQ FROM サブクエリ1 t1) AS t GROUP BY 商品コード; もちろん、合わせればクエリ一発でもできますが、わかりにくくなります。
その他の回答 (3)
- jamshid6
- ベストアンサー率88% (591/669)
#1です。 ちなみに書いたものはACCESS2000/2007で動作することは確認済です。 どこでエラーになるのか示してもらえると助かります。 「サブクエリ1」は 商品コード C -------------------- 0001 01 0001 02 0001 03 0001 04 0001 05 という結果を返してくれるはずですが、返ってきていますか? 次にメインクエリのうち、以下の部分は、 SELECT t1.商品コード, t1.C, (SELECT COUNT(*) FROM サブクエリ1 t2 WHERE t2.商品コード=t1.商品コード AND t2.C<=t1.C) AS SEQ FROM サブクエリ1 t1 商品コード C SEQ ----------------------- 0001 01 1 0001 02 2 0001 03 3 0001 04 4 0001 05 5 という結果を返してくれるはずですが、返ってきていますか?
お礼
サブクエリ1実行でエラーが出てしまいました。 Access97だからでしょうか・・? 試しに、SQL Serverのクエリで試したところ、サブクエリ1はうまくいきました。 メインクエリも構文をSQL Serverに合わせて一部変更(IIF→CASE WHEN ELSE)し実行したところ、何とか結果を出すことができました。 最終的にはAccessで処理が必要になるため、この結果をTabelに落としそれをAccessにインポートして使おうと思います。 無理かなと半ばあきらめていたので、非常に助かりました。 ありがとうございました。
Err_DBSum: MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSum)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strQuerySQL, _ vbExclamation, " 関数エラーメッセージ" Resume Exit_DBSum End Function
お礼
回答ありがとうございます。 ただ、c0~c4はコードであって数量ではありません。 例(【-元レコード-】)の通り商品コード'0001'に対して、c0~c4にコードが入ってきます。これが複数レコード存在するのですが 同コードでも同列に入ってくるとは限らず、バラバラに入ってきます。それを最終的に入ってきているコードを1レコードにまとめたいのですが。
tab1: [id][商品コード][c0][c1][c2][c3][c4] _01__0001_________1___1___1___1___1 _02__0001_________1___1___1___1___0 _03__0001_________1___1___1___0___0 _04__0002_________2___2___2___2___2 _05__0002_________2___2___2___0___0 クエリ1: [商品コード][c0_SUM][c1_SUM][c2_SUM][c3_SUM][c4_SUM] _0001_____________3_______3_______3_______2_______1 _0002_____________4_______4_______4_______2_______2 SELECT 商品コード, DBSUM("c0","tab1","商品コード='" & [商品コード] & "'") AS c0_SUM, DBSUM("c1","tab1","商品コード='" & [商品コード] & "'") AS c1_SUM, DBSUM("c2","tab1","商品コード='" & [商品コード] & "'") AS c2_SUM, DBSUM("c3","tab1","商品コード='" & [商品コード] & "'") AS c3_SUM, DBSUM("c4","tab1","商品コード='" & [商品コード] & "'") AS c4_SUM FROM tab1 GROUP BY 商品コード; DBSum関数の類を使えば簡単に集計することができます。 Access のDSum関数を使えると思ったのですが<循環参照エラー>が発生しますね。 が、以下のように独自のDSUM関数の代行関数を用意すれば回避出来るようです。 SELECT 商品コード, (SELECT SUM(c0) FROM tab1 WHERE 商品コード=X.商品コード) AS C0_Sum, (SELECT SUM(c1) FROM tab1 WHERE 商品コード=X.商品コード) AS C1_Sum, (SELECT SUM(c2) FROM tab1 WHERE 商品コード=X.商品コード) AS C2_Sum, (SELECT SUM(c3) FROM tab1 WHERE 商品コード=X.商品コード) AS C3_Sum, (SELECT SUM(c4) FROM tab1 WHERE 商品コード=X.商品コード) AS C4_Sum FROM tab1 As X GROUP BY 商品コード もちろん、DBSUM関数の実態はSELECT文です。 ですから、直接に記述しても同じ結果を得ます。 Public Function DBSum(ByVal strField As String, _ ByVal strTable As String, _ Optional strWhere As String = "") As Variant On Error GoTo Err_DBSum Dim N Dim strQuerySQL As String Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset strQuerySQL = "SELECT SUM(" & 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_DBSum: On Error Resume Next rst.Close Set rst = Nothing DBSum = N Exit Function Err_DBSum: MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSum)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strQuerySQL, _
お礼
回答ありがとうございます。 教えていただいた通りに実行したみたのですが、FROM句の構文エラーになってしまい上手くいきません。 これを元に自分なりにもやってみたのですが、エラーになったり理想の形に結果がでません。