過去ログ

                                Page      45
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼クロス集計  宮本 02/9/27(金) 16:28
   ┗Re:クロス集計  イケガミ 02/9/28(土) 23:42
      ┗Re:クロス集計  孫悟空 02/9/29(日) 18:52
         ┗Re:クロス集計  宮本 02/9/30(月) 11:18

 ───────────────────────────────────────
 ■題名 : クロス集計
 ■名前 : 宮本
 ■日付 : 02/9/27(金) 16:28
 -------------------------------------------------------------------------
   こんにちは またお世話になります。

仕入先A,B,C,D,・・・があって支払額を部門別100,200,300,400、・・・にクロス集計しています。
仕入先Xの支払額は毎月一定していますが、部門別金額を算出するのに仕入先A,Bだけの部門別合計の割合に依存しています。最終的にはクロス集計の形をとりたいのですが、アクセスだけで出来るように教えていただけないでしょうか?

     支払額計   100   200   300   400 
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
 A   1000   400   100   200   300
 B    800   100   300   150   250
 C    900   200   200   200   300
 D   1200   500   400   100   200
                                 
 X    500     ?     ?     ?     ?
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
部門計  4400     ?     ?     ?     ?

宜しくお願いいたします。

 ───────────────────────────────────────  ■題名 : Re:クロス集計  ■名前 : イケガミ <ikegami_kumamoto@dosule.com>  ■日付 : 02/9/28(土) 23:42  -------------------------------------------------------------------------
   なかなか、回答がつかないようですが。。
#私はクエリ自体が苦手なので、そのままにしていましたが。。

>仕入先Xの支払額は毎月一定していますが、部門別金額を算出するのに
>仕入先A,Bだけの部門別合計の割合に依存しています。

ここらへんの意味があんまり、理解できませんので、もう少し詳しく
説明していただけますか?

 ───────────────────────────────────────  ■題名 : Re:クロス集計  ■名前 : 孫悟空  ■日付 : 02/9/29(日) 18:52  -------------------------------------------------------------------------
   宮本さん、イケガミさんこんばんは、横レス失礼します。
 わたしも、いろいろ想像を働かせながら、考えてみましたが、
複雑なクエリーを組むより集計前のデータそのものを
修正した方が、一番素直でしょう。
 集計元のテーブル構造がわからないですが、
もし以下の様な構造で、

CREATE TABLE
テスト_tbl(
支店 TEXT(10),
部門 TEXT(10),
金額 LONG,
PRIMARY KEY
(支店,部門)
)

以下のようなデータを集計するなら
支店    部門        金額    
A    100        400    
A    200        100    
A    300        200    
A    400        300    
A    支払額計    1000    
B    100        100    
B    200        300    
B    300        150    
B    400        250    
B    支払額計    800    
C    100        200    
C    200        200    
C    300        200    
C    400        300    
C    支払額計    900    
D    100        500    
D    200        400    
D    300        100    
D    400        200    
D    支払額計    1200
X    支払額計    500    

下記のようなモジュールで不足するデータを補う事が可能です。

Sub X社のデータ追加()
  Dim Ms_Db, Ms_Rs, Ms_Rs2 As Object
  Dim X_delSQL, 比率SQL, 総額SQL, Ins_SQL As String
  Set Ms_Db = CurrentDb
  
  'X社の売り上げから支払額計以外の金額を削除します。
  X_delSQL = ""
  X_delSQL = X_delSQL & "DELETE" & Chr(13) & Chr(10)
  X_delSQL = X_delSQL & "FROM テスト_tbl" & Chr(13) & Chr(10)
  X_delSQL = X_delSQL & "WHERE 支店='X'" & Chr(13) & Chr(10)
  X_delSQL = X_delSQL & "and" & Chr(13) & Chr(10)
  X_delSQL = X_delSQL & "部門<>'支払額計';"
  Ms_Db.Execute X_delSQL, dbFailOnError
  
  'X社の支払いを各部門単位にデータを追加してきます。
  まずは、部門毎の総額を求めておきます。
  総額SQL = ""
  総額SQL = 総額SQL & "select" & Chr(13) & Chr(10)
  総額SQL = 総額SQL & "部門," & Chr(13) & Chr(10)
  総額SQL = 総額SQL & "sum(金額) as 部門合計金額" & Chr(13) & Chr(10)
  総額SQL = 総額SQL & "from テスト_tbl" & Chr(13) & Chr(10)
  総額SQL = 総額SQL & "where" & Chr(13) & Chr(10)
  総額SQL = 総額SQL & "部門<>'支払額計'" & Chr(13) & Chr(10)
  総額SQL = 総額SQL & "group by" & Chr(13) & Chr(10)
  総額SQL = 総額SQL & "部門"
  Set Ms_Rs2 = Ms_Db.OpenRecordset(総額SQL)

  Do While Not Ms_Rs2.EOF
  '改めて支店AB総額から計算してXの売り上げを算出してレコードに追加していきます。
    '各部門毎の支店ABの売り上げ比率を算出します。
    比率SQL = ""
    比率SQL = 比率SQL & "SELECT 'AB_比率'," & Chr(13) & Chr(10)
    比率SQL = 比率SQL & "sum(iif(部門='" & Ms_Rs2("部門").Value & "',金額,0))/Sum(金額) AS 比率" & Chr(13) & Chr(10)
    比率SQL = 比率SQL & "from テスト_tbl" & Chr(13) & Chr(10)
    比率SQL = 比率SQL & "where" & Chr(13) & Chr(10)
    比率SQL = 比率SQL & "(支店='A' Or 支店='B')" & Chr(13) & Chr(10)
    比率SQL = 比率SQL & "and" & Chr(13) & Chr(10)
    比率SQL = 比率SQL & "部門<>'支払額計'" & Chr(13) & Chr(10)
    比率SQL = 比率SQL & "Group by 'AB_比率';"
    Set Ms_Rs = Ms_Db.OpenRecordset(比率SQL)

    'データ追加クエリーを実行します。
    Ins_SQL = ""
    Ins_SQL = Ins_SQL & "insert into" & Chr(13) & Chr(10)
    Ins_SQL = Ins_SQL & "テスト_tbl" & Chr(13) & Chr(10)
    Ins_SQL = Ins_SQL & "(支店,部門,金額)" & Chr(13) & Chr(10)
    Ins_SQL = Ins_SQL & "values" & Chr(13) & Chr(10)
    Ins_SQL = Ins_SQL & "(" & Chr(13) & Chr(10)
    Ins_SQL = Ins_SQL & "'X'," & Chr(13) & Chr(10)
    Ins_SQL = Ins_SQL & "'" & Ms_Rs2("部門").Value & "',"
    Ins_SQL = Ins_SQL & Ms_Rs("比率").Value * Ms_Rs2("部門合計金額").Value & Chr(13) & Chr(10)
    Ins_SQL = Ins_SQL & ")"
    Ms_Db.Execute Ins_SQL, dbFailOnError
    DoEvents
    Ms_Rs2.MoveNext
  Loop

  MsgBox "クロス集計クエリーを実行してください。"
  Set Ms_Rs = Nothing
  Set Ms_Rs2 = Nothing
  Set Ms_Db = Nothing
End Sub

実行後クロス集計を実行すれば、いかがかと。
外れでしたらすみません。

 ───────────────────────────────────────  ■題名 : Re:クロス集計  ■名前 : 宮本  ■日付 : 02/9/30(月) 11:18  -------------------------------------------------------------------------
   イケガミさん 孫悟空さん おはようございます。
連休してる間にご回答いただき有難うございます。

WIN98 AC2000です。書くの忘れました。ごめんなさい。

今の私には少しレベルが高いのですが、孫悟空さんの方法にトライしてみます。
解らないところが出てくればまたよろしくお願いします。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 45