初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2019-10-23 16:38:33

kuro3
Guest

自己リレーション先の最頻値

御世話になります。
自己リレーションした上で あるフィールドの値の最頻値を取得したいのですが、方法は有りますか?
ご教授をお願いします。

fm16
WINDOWS7

#2 2019-10-23 17:21:10

koko009
Guest

Re: 自己リレーション先の最頻値

参考にならないが自己リレーションしない方法で・・・適当なテーブル名とフィルド名です
ExecuteSQL ( " SELECT \"商品\",COUNT(\"商品\")
FROM \"売上\"
WHERE \"日付\" BETWEEN  ?AND ?
GROUP BY \"商品\"
HAVING COUNT(*) >= ALL ( SELECT COUNT(*) FROM \"売上\"
WHERE \"日付\" BETWEEN  ?AND ?
GROUP BY \"商品\")
";Char(9);"";管理::開始日;管理::終了日;管理::開始日;管理::終了日)

#3 2019-10-23 17:34:20

koko009
Guest

Re: 自己リレーション先の最頻値

書き忘れた、この方法だとHAVING句を使っているのでレコード量によってかなりパフォーマンス悪くなるかも、同じようにExecuteSQL関数を 使って別テーブルにLoopで対象レコードだけ生成しExecuteSQL関数でカウントする方法も・・

#4 2019-10-23 17:51:57

koko009
Guest

Re: 自己リレーション先の最頻値

もう一つ書き忘れたレコードのソートとGetSummaryを使いカウントしloop処理で導き出す方法がある。

#5 2019-10-23 20:23:46

Hiro
Member

Re: 自己リレーション先の最頻値

自己リレーションの内容説明が無いので、
取り合えず、
『指定月内の販売商品の最頻値を求める』
と仮定した場合の取得計算式は、

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   みかん

【計算手順】

  1. 10月例内の頻度集計結果
    リンゴ:1
    バナナ:2
    みかん:3

  2. 上リストを数字で降順ソート
    みかん:3
    バナナ:2
    リンゴ:1

  3. そこから最大頻度の商品(=先頭行)を選出
    みかん:3

Offline

#6 2019-10-23 21:14:12

koko009
Guest

Re: 自己リレーション先の最頻値

最頻値が複数存在する場合を思慮してGetSummaryの値をLoopで比較し同じ値を全て出す。
GetValue(SortValues(#sql;-2); 1)
では最初の一行(=先頭行)だけしか出ないのでは

#7 2019-10-23 22:10:08

Hiro
Member

Re: 自己リレーション先の最頻値

>#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

#8 2019-10-24 09:39:50

kuro
Member

Re: 自己リレーション先の最頻値

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

#9 2019-10-24 15:19:08

Shin
Member

Re: 自己リレーション先の最頻値

> 「フィールドあ」と「フィールドい」の組み合わせごとにフィールドうの最頻値を出したいのです
あ い う
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

#10 2019-10-24 23:27:10

Hiro
Member

Re: 自己リレーション先の最頻値

>#8『「フィールドあ」と「フィールドい」の組み合わせごとに「フィールドう」の最頻値を出したい』
最初の質問と全く違ってしまった!
要は、最頻値の「クロス集計」表ですネ。

以下 2つの「繰り返しSQL計算フィールド」追加だけで実装する、いたってシンプルな解法案です。
※繰り返し回数は、組合せ総数を最大とした任意必要回数を指定。
※複数同順1位は、全項を一覧表示。
※「フィールドう」内の数字混在が可能、対策済み。

  1. 【g組合一覧】繰り返し計算フィールド(計算結果:グローバル格納保存、テキスト形式)

    Let(
    [
       #lst=
          ExecuteSQL(
             "
                SELECT DISTINCT(""フィールドあ""+""フィールドい"")
                FROM ""テーブル""
             "
             ; ""
             ; ¶
          )
    ];
       GetValue(#lst; Get(計算式繰り返し位置番号))
          & Left(フィールドあ[1]&フィールドい[1];0)     //←無害の再SQL計算誘発トリガーの影式
    )

       

  2. 【最頻値一覧】繰り返し計算フィールド(計算結果:非保存、テキスト形式)

    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
xhBNFJ

Last edited by Hiro (2020-05-12 21:59:10)

Offline

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.006 seconds, 7 queries executed - Memory usage: 574.69 KiB (Peak: 591.59 KiB) ]