みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
御世話になります。
自己リレーションした上で あるフィールドの値の最頻値を取得したいのですが、方法は有りますか?
ご教授をお願いします。
fm16
WINDOWS7
参考にならないが自己リレーションしない方法で・・・適当なテーブル名とフィルド名です
ExecuteSQL ( " SELECT \"商品\",COUNT(\"商品\")
FROM \"売上\"
WHERE \"日付\" BETWEEN ?AND ?
GROUP BY \"商品\"
HAVING COUNT(*) >= ALL ( SELECT COUNT(*) FROM \"売上\"
WHERE \"日付\" BETWEEN ?AND ?
GROUP BY \"商品\")
";Char(9);"";管理::開始日;管理::終了日;管理::開始日;管理::終了日)
書き忘れた、この方法だとHAVING句を使っているのでレコード量によってかなりパフォーマンス悪くなるかも、同じようにExecuteSQL関数を 使って別テーブルにLoopで対象レコードだけ生成しExecuteSQL関数でカウントする方法も・・
もう一つ書き忘れたレコードのソートとGetSummaryを使いカウントしloop処理で導き出す方法がある。
自己リレーションの内容説明が無いので、
取り合えず、
『指定月内の販売商品の最頻値を求める』
と仮定した場合の取得計算式は、
Let(
[
#月=10;
#年=2019;
#sql=
ExecuteSQL(
"
SELECT ""商品"" , COUNT(""商品"")
FROM ""テーブル名""
WHERE ""日付"" BETWEEN ? AND ?
GROUP BY ""商品""
"
; ":"
; ¶
; Date(#月;1;#年)
; Date(#月+1;0;#年)
)
];
GetValue(SortValues(#sql;-2); 1)
)
【事例】
・9/1 リンゴ
・10/1 リンゴ
・8/1 バナナ
・9/1 バナナ
・10/1 バナナ
・10/2 バナナ
・10/1 みかん
・10/2 みかん
・10/3 みかん
【計算手順】
10月例内の頻度集計結果
リンゴ:1
バナナ:2
みかん:3
上リストを数字で降順ソート
みかん:3
バナナ:2
リンゴ:1
そこから最大頻度の商品(=先頭行)を選出
みかん:3
Offline
最頻値が複数存在する場合を思慮してGetSummaryの値をLoopで比較し同じ値を全て出す。
GetValue(SortValues(#sql;-2); 1)
では最初の一行(=先頭行)だけしか出ないのでは
>#6『最頻値が複数存在する場合を思慮』
して、同位項目を全項リストアップするなら、
#5式中の打消部分式を下記式に変更すれば良いでしょう。
● GetValue(SortValues(#sql;-2); 1)
↓
Let(
[
#dsc=SortValues(#sql;-2);
#max=GetValue(Substitute(GetValue(#dsc;1);[":";¶]);2);
#cnt=PatternCount(#sql;":"&#max)
];
LeftValues(#dsc;#cnt)
)
Last edited by Hiro (2019-10-23 23:08:31)
Offline
koko009さん hiroさん
ご教授ありがとうございます。
説明が少なくすみません。
自己リレーションではなく自己テーブルで
フィールドあ フィールドい フィールドう
というフィールドを使います。
hiroさんから教えていただいた関数を
使いましたが数字が出て来ません。
式が間違っているのだと思うのですが、
構造を理解していない為、応用できません。
間違いをご指摘いただければ、幸いです。
「フィールドあ」と「フィールドい」の組み合わせごとにフィールドうの
最頻値を出したいのです
宜しくお願いします。
Let(
[ #sql=
ExecuteSQL(
"
SELECT """"フィールドあ, フィールドい , COUNT(""フィールドう"")
FROM ""テーブル""
GROUP BY ""フィールドあ, フィールドい""
"
; ":"
; ¶
)
];
Let(
[
#dsc=SortValues(#sql;-2);
#max=GetValue(Substitute(GetValue(#dsc;1);[":";¶]);2);
#cnt=PatternCount(#sql;":"&#max)
];
LeftValues(#dsc;#cnt)
))
Last edited by kuro (2019-10-24 09:59:21)
Offline
> 「フィールドあ」と「フィールドい」の組み合わせごとにフィールドうの最頻値を出したいのです
あ い う
a a n
a a m
a a m
a b o
a b o
a b p
ならば、
a a m
a b o
を作る、ということでしょうか。
集計フィールドを1個追加するだけで計算式を必要としない、集計機能のみのサンプル
https://www.dropbox.com/s/dknoljn5rr86d … 2.zip?dl=0
Last edited by Shin (2019-10-25 08:44:54)
Offline
>#8『「フィールドあ」と「フィールドい」の組み合わせごとに「フィールドう」の最頻値を出したい』
最初の質問と全く違ってしまった!
要は、最頻値の「クロス集計」表ですネ。
以下 2つの「繰り返しSQL計算フィールド」追加だけで実装する、いたってシンプルな解法案です。
※繰り返し回数は、組合せ総数を最大とした任意必要回数を指定。
※複数同順1位は、全項を一覧表示。
※「フィールドう」内の数字混在が可能、対策済み。
【g組合一覧】繰り返し計算フィールド(計算結果:グローバル格納保存、テキスト形式)
Let(
[
#lst=
ExecuteSQL(
"
SELECT DISTINCT(""フィールドあ""+""フィールドい"")
FROM ""テーブル""
"
; ""
; ¶
)
];
GetValue(#lst; Get(計算式繰り返し位置番号))
& Left(フィールドあ[1]&フィールドい[1];0) //←無害の再SQL計算誘発トリガーの影式
)
【最頻値一覧】繰り返し計算フィールド(計算結果:非保存、テキスト形式)
Let(
[
#sql=
ExecuteSQL(
"
SELECT COUNT(""フィールドう"") , ""フィールドう""
FROM ""テーブル""
WHERE (""フィールドあ""+""フィールドい"")=?
GROUP BY ""フィールドう""
"
; "."
; ¶
; g組合一覧
);
#dsc=SortValues(#sql;-2);
#max=Int(GetValue(#dsc;1));
#cnt=PatternCount(#dsc;#max&".");
#top=LeftValues(#dsc;#cnt)
];
Substitute(#top;[".";" x "])
& Left(フィールドう[1];0) //←無害の再計算誘発トリガーの影式
)一応、実装デモサンプルをアップしておきます。
●作例サンプル「最頻値のクロス集計.fmp12」 → https://1drv.ms/u/s!AlaCGhTKTWEOp30zbV3 … R?e=8wjCVo
Last edited by Hiro (2020-05-12 21:59:10)
Offline
Pages: 1
[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 575.41 KiB (Peak: 592.31 KiB) ]