みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
お世話になります。
さて、以下の様なクロス集計をしたいと考えております。
◎テーブル
【社員】
社員ID
氏名
【売上】
社員ID
日付
金額
◎得たい結果
社員ID 氏名 2010年の売上合計 2011年の売上合計 2012年の売上合計 …… 横合計
000001 太郎 1000 2000 1500 4500
000002 次郎 2000 1500 3000 6500
------------------------------------------------------------------------------------------
縦合計 3000 3500 4500 11000
◎その他
・何年から何年までを集計対象にするかはグローバルフィールド等で指定したい。
・上記の表の各行(縦合計以外)をエクセルにエクスポートしたい。
・環境 Windows10、Filemaker Pro 15 Advanced
==============================
典型的なクロス集計のパターンだと思ったので、過去ログを探して、サンプルも色々見てみたのですが、そのまま当てはまりそうなものを探せなかったので、投稿させて頂きました。
「過去のこの記事がそのまま当てはまるよ」とかでも構いませんので教えて頂けると助かります。
よろしくお願いします。
Offline
> ●何年から何年までを集計対象にするかはグローバルフィールド等で指定したい。
・過去ログid:3983「★ 「クロス集計」サンプルを公開 ★」で基本を習得してください。
・次に、要求になるべく近い事例サンプルを過去ログ検索で見つけてください。
・クロス集計の基本が身についていれば、近似サンプルの改造は容易と思います。
・時系列推移でのクロス集計は、カレンダー系や予約系サンプルを当たって下さい。
> ●上記の表の各行(縦合計以外)をエクセルにエクスポートしたい。
※これはかなり難しいでしょう。理由もクロス集計を習得すれば見えてくると思います。
・最終目的がExcelへ転記なら、
・わざわざ苦手なデータベースソフトFMで遣らなくても
・基礎データだけ送って、
・得意な表計算ソフトExcel側で遣れば良いのでは?
Last edited by Hiro (2017-12-30 16:02:15)
Offline
Hiroさん、ありがとうございました。
おかげさまで、クロス集計に対する理解が深まり、少なくとも紹介して頂いたサンプルについては理解ができたと思います。
さて、その上で、項目を任意で指定できるように、サンプルに次の修正を加えてみました。
・「項目一覧元」というテキストフィールド(グローバル)作る。
・このフィールドに任意の項目を改行区切りで手動で入力する。
・「項目一覧」フィールドは「項目一覧元」を元に各繰り返しフィールドに値を代入するように変更。
・新たに「マスタテーブル 5」というTOを作成。
・「マスタテーブル」の「項目一覧元」と「マスタテーブル 5」の「項目」をリレーションで結ぶ。
・値一覧の「区分トップIDs」の最初のフィールドの値のところを「マスタテーブル 5」の「レコードID」に、2番目のフィールドのところを「マスタテーブル 5」の「区分」にする。
・更に、次のレコードから関連レコードの値のみを含めるに「マスタテーブル」指定。
・ソートを「2番目のフィールド」に指定。
こうすることによって、取得する「レコードID」を絞り込み、その上で各「区分」の先頭の「レコードID」を値一覧にしたかったのですが、この方法だと同じ「区分」の「レコードID」が複数、値一覧に入ってしまいました。
これは仕様でしょうか?
また、これを回避して、意図通りに、各「区分」の先頭の「レコードID」のみのを取得するにはどうしたらよろしいでしょうか?
Offline
サンプルファイルで、項目一覧 フィールドの変更は、それでいいでしょう。
区分トップIDs の変更は不要です。特に、2番目のフィールドとしてしていすると、1番目のフィールドの一意性は失われますので、同じデータが出てきます。
新たな TO は不要でしょう。
そのままで、関連レコードへ移動 で、テーブル4 へ移動すれば、目的のレコードに絞り込まれているはず。それをソートしてから書き出せば良いのでは。
Offline
#4 Shinさん回答 に賛同です。
Offline
区分トップIDs を変更しないままだと、この値は「1¶7」に固定されませんか?
例えば 項目一覧 を「い う」にした場合は、区分トップIDsを「2¶8」に、
「う」にした場合は、「6¶9」になるようにしたいと思ったのですが。
Offline
説明の意味が分かりません。その意図も分かりません。
同一「区分」内の項目一覧も集計一覧もその内容は同一です、から!
同一「区分」内のレコードIDを差し替えても、結局表示内容は同じです。
Offline
あ、そうですね。
確かに項目一覧を「い う」に絞っても、
表示結果は
い う
A 2 1
B 1 1
という感じで期待通りになりますね。
ただ、これは区分A及びBが、それぞれ項目が「い」あるいは「う」のレコードを含んでいるから問題ないのですが、
例えば、このサンプルに「C え」というレコードを追加して、
項目一覧を「え」にしたら、
え
A
B
C 1
になるかと思います。
これを、
え
C 1
となるようにするにはどうしたら良いでしょう?
Last edited by KN0319 (2018-01-04 21:41:41)
Offline
改造設定説明代わりにカスタム修正版サンプルをアップしましたので、解析くださいネ。
●修正版サンプル「指定対象レコードのクロス集計.fmp12」→ https://yahoo.jp/box/lZ42k5
Offline
ありがとうございます。
とても参考になりました。
ところで、管理ー値一覧で「区分トップIDs2」の「フィールド指定」を開いて、「OK」を押すと、
『フィールド「区分トップID」は索引設定ができないため、この値一覧は動作しません。処理を続けますか?』
というメッセージが出ます。
それでも特に問題なく動作しているように見えるのですが、何か注意する点はありますか?
Offline
結果オーライの裏技的手法なので、実質問題ないかと思いますが、
どうしても気になるなら、SQL関数が使えるFMP12以降に限っての代案、
「区分トップIDs」の式を以下に変更、(問題の値一覧を使わず、SQLで直接算出)
Let(
[
#in=Substitute("'" & 項目リスト & "'"; ["¶";"','"]); //う¶え → 'う','え' へ変換
#sql="SELECT DISTINCT \"区分トップID\" FROM \"マスタテーブル\" WHERE \"項目\" IN(" & #in & ")"
];
ExecuteSQL(#sql; ""; ¶)
)
Offline
ありがとうございます。
ExecuteSQLの指定の仕方も知っておきたかったので助かりました。
Offline
Pages: 1
[ Generated in 0.008 seconds, 11 queries executed - Memory usage: 590.66 KiB (Peak: 607.57 KiB) ]