14 返信 最新の回答 日時: Dec 25, 2010 5:08 AM ユーザー:J

    集計表の作り方について

    J

      タイトル

      集計表の作り方について

      フォーラムに投稿

      みなさんこんにちは

      例えばテーブルAに以下のようなデータがあったとします

      区分 項目

      A  あ

      A  い

      A  あ

      A  あ

      A  い

      A  う

      B  あ

      B  い

      B  う

      B  う

      ここから

      あ  い  う

      A 3  2  1

      B 1  1  2

      のような感じの集計表を作りたいとします。

      いままでは、別のテーブル「テーブルB」に

      「区分」「あの数」「いの数」「うの数」「リレーション用あ」「リレーション用い」「リレーション用う」というフィールドを作成して..

      「リレーション用〜」のフィールドはグローバルにしてそれぜろ「あ」「い」「う」と入力

      テーブルAのTOを3つつくり「テーブルA_あ用」「テーブルA_い用」「テーブルA_う用」とします

      それぞれのTOからテーブルBへ「区分」どうしをつなぎ、3つのTOの区分からテーブルBのリレーション用のフィールドそれぞれにつなぎます。

      テーブルBの「〜の数」フィールドに計算式を設定します

      こんな感じでつくっていました。かなり分かりにくくてすみません。

      この方法だと、項目の種類の分だけ集計用のテーブルでグローバルフィールドが、またデータのテーブルのTOが増えていくことになりますよね。項目の種類が多くなると複雑になってしまいます。

      もっと良い方法は無いものかと思い質問させていただきました。よろしくお願いします。

        • 1. Re: 集計表の作り方について
          hiro_

          典型的なクロス集計です。

          FMでは比較的不得意な分野ですが、

          値一覧(ソート一意化機能)と繰り返しフィールド(個別ルックアップ機能)とを利用すると、

          簡潔な構成で取得できます。

          例えば本事案では、値一覧x1(2)、繰り返しフィールドx2、リレーションx3、だけで取得でき、

          その後幾ら区分や項目数が増えても対応できます。(項目が増えたら繰り返し表示回数を増やすだけ)

          更なる説明代わりにサンプル「クロス集計例.fp7」を作りアップしておきますので、

          宜しかったらご覧下さい。

          http://briefcase.yahoo.co.jp/bc/brghspr/lst?&.dir=/352b/c1ed&.src=bc&.view=l

          • 2. Re: 集計表の作り方について
            Shin

            リレーションを使わない方法を御紹介しておきます。

            まず、グローバル繰り返しフィールド「項目タイトル」に、項目名(ここでは、「あ」「い」「う」)を設定します。これは、ValueListItems()関数を使って設定する事も出来ると思います

            次に、各レコードに、

            Extend ( 項目 ) = 項目タイトル

            という計算式を設定した繰り返し計算フィールド「該当項目」を作ります。

            次に、その「該当項目」を集計する為の繰り返し集計フィールドを作ります。集計対象は「該当項目」として、合計を集計します。

            集計レイアウトを作り、「区分をキーとした小計パート」に集計フィールドを配置します。この状態で区分でソートをかければ、FM10以降でしたらブラウズモードで、FM9以前でしたらプレビューにすると、上の票の形式で表示されます。

            • 3. Re: 集計表の作り方について
              J

              hiroさん

              サンプルありがとうございます

              やりたい事が完全に出来ることがわかりました。

              この方法なら項目数が増えても大丈夫ですね。いままでひたすらTOを増やして集計していたので非常に面倒でした。この方法なら簡単ですね!

              ただ...1ヶ所わからない部分がありまして教えていただけないでしょうか?

              Lookup関数を使われている部分です

              「マスターテーブル3」というTOから「集計」フィールドをLookup関数で引いていますが、これがどうして繰り返しフィールドの正しい位置(?)に引かれてくるんでしょうか?いまいち理解できないでいます。

              レベルの低い質問ですみません。

              よろしくお願いします。

              • 4. Re: 集計表の作り方について
                J

                shinさん

                ありがとうございます。

                とりあえず教えていただいた方法で作ってみたらうまく出来ました。

                Extend(項目)=項目タイトル

                の部分がいまいち理解できないので教えていただきたいのですが...

                レコードの「項目」フィールドの値と繰り返しフィールドの「項目タイトル」が等しいときはtrue→1が帰ってきて...

                それを集計フィールドで合計しているって理解で良いのでしょうか?

                • 5. Re: 集計表の作り方について
                  hiro_

                  > 「マスターテーブル3」というTOから「集計」フィールドをLookup関数で引いていますが、これがどうして繰り返しフィールドの正しい位置(?)に引かれてくるんでしょうか?

                  忘れられていますが、大昔からあった繰り返し独自の便利機能です。
                  昔は、売上伝票などの明細欄は繰り返しフィールドを連ねて表表示していました。
                  例えば、 商品  単価  数量  金額  と表組みしてあって、
                  ある位置の商品に値を入れるとその値に対応したルックアップ値が単価の同じ位置に自動で入るようにセットしていました。
                  この忘れかけた機能を利用しています。
                  ただし、旧来のルックアップ機能は自動更新が出来ませんが、Lookup関数を利用することで「計算結果非保存」機能が使え、
                  自動更新が実装出来るようになりました。
                  それなら、このリレーションの関連単価フィールドを表示すれば同じかと思われますが、これはダメです。
                  あくまでルックアップだからこその特殊機能です。

                  • 6. Re: 集計表の作り方について
                    J

                    >忘れられていますが、大昔からあった繰り返し独自の便利機能です。

                    なるほど!

                    独自の機能なんですね。

                    以前、リレーションを勉強している時に繰り返しフィールドを使ってリレーションすれば表計算ソフトみたいな感じで計算式が使えるのかもと期待して試した事があります。結果は..計算式を設定したフィールドの全ての繰り返し位置に同じ値が表示されました。当たり前といえば当たり前ですが..。今回はなぜLookup関数だと繰り返しの正しい位置に値が表示されるのかが疑問だったんですが、ルックアップ独自の機能なんですね。

                    覚えておくと便利そうです!

                    いろいろと教えていただきありがとうございました!

                    P.S

                    クロス集計はわかりやすい機能が標準で準備されると良いのですが...


                    • 7. Re: 集計表の作り方について
                      hiro_

                      閲覧ビュー数からクロス集計は結構みなさん関心があるようなので、解決済みですが少し補足します。

                       この解法は、値一覧(ソート一意化機能)と繰り返しフィールド(個別ルックアップ機能)の特殊機能を利用していますが、先のサンプルでは今回の事例を受けて自己テーブルに適用するケースだったのですが、もし関連テーブルに適用する場合には少し要領が必要です。

                      ・動的値一覧には第二フィールドソート一意化機能が非対応で利用できません。静的値一覧でソート一意化を利用して、その結果と関連照合との複合条件式でリレーションを組み、目的の結果を得るようにします。

                      ・繰り返しフィールドの個別ルックアップ機能は関連フィールドに対してはその同じ位置番号からしかルックアップできません。そこで、ルックアップ値フィールド(関連フィールド)は、同回数の繰り返し計算フィールドを作り、このフィールドにルックアップ値が全項目に格納されるように式設定します。

                      • 8. Re: 集計表の作り方について
                        Shin

                        Extend(項目) = 項目タイトル

                        は、論理式、として使っています。

                        これは、この比較が真ならば1を、偽ならば0を返す、という論理演算の性質を使い、そのままそれを数値として扱うことで、計算させています。その繰り返しフィールドをそのまま観察すれば、タイトルと一致する1項目だけが1となっていると思います。

                        この方法の優れたところは、タイトルを変更すれば、集計の区分が簡単に変更できること、集計そのものには、本来の集計機能を使っているため、検索やソートを変更すれば、集計対象や集計キーが簡単に変更できることです。

                        例えば、区分が複数あったとしても、第1区分だけでソートすれば第1区分での集計が、第1区分と第2区分でソートすれば第1区分ごとの第2区分での集計が得られます。そのためには、ソートを変更するだけですので、リレーションを使った固定された集計とは違った、非常に柔軟な集計が可能です。

                        さらに、選択肢の中の複数の項目を選べるような場合、例えば、

                        区分 項目
                        A  あ い
                        A  あ 
                        B  あ い


                        あ い
                        A  2 1 
                        B  1 1

                        というような集計も可能です。この場合には、上の式を、Pattercount() などに変更するといいでしょう。

                        サンプルファイルを公開しておきます。

                        http://files.me.com/hiramatsu/uukn3f

                        • 9. Re: 集計表の作り方について
                          J

                          Hiroさん

                          いろいろとありがとうございます。

                          >・繰り返しフィールドの個別ルックアップ機能は関連フィールドに対してはその同じ位置番号からしかルックアップできません。そこで、ルックアップ値フィールド(関連フィールド)は、同回数の繰り返し計算フィールドを作り、このフィールドにルックアップ値が全項目に格納されるように式設定します。

                          この部分がいまいち理解出来ずにいます。申し訳ありませんが解説をお願い出来ないでしょうか?

                          よろしくお願いします。

                          • 10. Re: 集計表の作り方について
                            hiro_

                            先の売上伝票の例で説明すると、
                            売上テーブルと商品テーブルがあり、商品番のリレーションで商品テーブルの単価をルックアップする場合、
                            リレーションは、「売上テーブル::商品番[N]」=「商品テーブル::商品番」、
                            この時、ルックアップフィールドは、「売上テーブル::単価[N]」なので「商品テーブル::単価」も「商品テーブル::単価[N]」繰り返しにしないと同じ位置にルックアップできません。([N]は繰り返しフィールドの意)
                            具体的には、
                             「売上テーブル::商品番[N]」=|001|002|003|004|
                             「売上テーブル::単価[N]」 =|100|200|300|400|
                            このようなルックアップ単価を得るためには、
                            ルックアップ先「商品テーブル」のデータは、
                             ・「商品番」=|001| 「単価[N]」=|100|100|100|100|
                             ・「商品番」=|002| 「単価[N]」=|200|200|200|200|
                             ・「商品番」=|003| 「単価[N]」=|300|300|300|300|
                             ・「商品番」=|004| 「単価[N]」=|400|400|400|400|
                             ・「商品番」=|005| 「単価[N]」=|500|500|500|500|
                             ・「商品番」=|006| 「単価[N]」=|600|600|600|600|
                            のように、単価は計算繰り返しフィールドにし同じ値を列挙する必要があります。
                            非繰り返しフィールドでは第一項目にしかルックアップ値が入りません。
                            ご自身でテストしてみてください。

                            他のBBS例ですが、ちょうどご質問と同じ内容のサンプルをアップしてありますので、宜しかったらご覧下さい。
                            ●レス番号[48629]{宿帳} http://www.russ.jp/stepbbs/step.cgi?mode=view&no=48629
                             サンプル「宿帳.fp7」.zip http://briefcase.yahoo.co.jp/bc/brghspr/lst?&.dir=/352b/7c92&.src=bc&.view=l

                            なお、サンプルは、繰り返しルックアップのリレーションに「OR照合」のリレーションを使って、面白いルックアップ結果を得ています。この辺りの使い方にもご注目ください。

                            • 11. Re: 集計表の作り方について
                              J

                              Hiroさん

                              いつもありがとうございます(一覧表の方でも結局同じ問題だったようです)。

                              サンプルも参考になりました。

                              • 12. Re: 集計表の作り方について
                                J

                                たびたびすみません

                                問題解決したはずだったのですが...

                                はまってしまいました。

                                Hiroさんに教えていただいた方法で集計表を作っていたのですが...

                                繰り返し数25で作っているのですが繰り返し位置が2,3の位置に入るはずの値が引けなくて困っています。

                                他(1,4〜25の位置)の位置の値は正しく引けています。

                                なぜか2,3の位置に入るはずの値だけが戻ってこないのです。

                                集計表は別テーブルにしています。

                                思い当たる点があったら教えていただけないでしょうか?

                                よろしくお願いします。

                                • 13. Re: 集計表の作り方について
                                  hiro_

                                  > 集計表は別テーブルにしています。

                                  だと、別スレット「一覧表の作り方について」一覧表の作り方について のサンプルhttp://briefcase.yahoo.co.jp/bc/brghspr/lst?&.dir=/352b/9669&.src=bc&.view=l の要領で設定していますよネ。

                                  > 他(1,4〜25の位置)の位置の値は正しく引けています。 なぜか2,3の位置に入るはずの値だけが戻ってこないのです。

                                  現物を見てみないと解りませんが、これだと部分的な問題なので、設定の方は合っていて、問題箇所のキーワードかルックアップ値が代入ミスしている可能性が疑われます。

                                  • 14. Re: 集計表の作り方について
                                    J

                                    Hiroさんいつもありがとうございます

                                    いろいろと試していますが、未だ解決していません。

                                    >問題箇所のキーワードかルックアップ値が代入ミスしている可能性が疑われます。

                                    確かに、2,3の位置以外は正しく値が引っ張れるのでルックアップ値の代入ミスが考えられますよね。

                                    というわけで以下の事を試してみました。

                                    やったこと

                                    ルックアップ値を入れている繰り返しフィールドの1〜25全ての位置に同じ値をペーストする

                                    結果

                                    2,3の位置は空欄に、1および4〜25の位置には正しい値が表示される

                                    ペーストする値を何種類か試しましたが結果は同じです。となると代入ミスでは無いと考えられます。

                                    ちょっとお手上げかもしれません。もう少し粘ってみるのでまた報告します。