過去の桐井戸端BBS (桐ver.8)
17241 小計で切り上げしたものを中計で集計したい 桐もみ 2002/09/10-23:04
いつも参考にさせてもらっています。単純すぎて申し訳ないのですが、ご教授下さい。
表定義の中で、下記のような行集計を行おうとしたのですが、値が不適正です。
  項目A  項目B   金額
  事業名1 1−1  3,400
  事業名1 1−2  4,500
  事業名1 1−2    600
  事業名2 1−1  2,100
  事業名2 1−2  4,500
集計行の定義で、上記の項目Aと、項目Bをグループとし、項目Bグループで金額を
小計(#切り上げ(#合計,−4))定義し、さらに項目Aグループで金額を
中計(#切り上げ(#合計,−4))したとき、
  事業名1 1−1  3,400
S             4,000
  事業名1 1−2  4,500
  事業名1 1−2    600
S             6,000
M            10,000
  事業名2 1−1  2,100
S             3,000
  事業名2 1−2  4,500
S             5,000
M             8,000
小計で切り上げしたものを中計で#合計すれば千円単位での中計になるかと思いきや
各データの中計になり、#切り上げ(#合計,−4)を入れたら明らかに中計の金額が合いません。
何か計算式を入れないとダメですか?

17247 Re:行集計について 佐田 守弘 2002/09/11-23:02
記事番号17241へのコメント
桐もみさん
行集計は、下位の集計で丸め処理を行ってもその丸めが上位の集計に反映される訳ではありません。
各グループの集計値は、どのグループでも元データを使って集計します。
そうしないとおかしな集計値になってしまうはずです。
(切り上げ値を積上げたら、とんでもない水増しになるのでは)

御質問の様に、小計で切り上げを行っても、この切り上げは小計値だけに反映されるだけで、
これを集計したものが中計になる訳ではありません。

小計で切り上げたものを集計して中計としたいのであったら、
小計の集計結果を表に書き出して保存し、これを集計するしかないでしょう。
あるいはこの切り上げ値を表引きで参照し、それを集計するのも1つの方法かと思います。

佐田守弘(KS-00119)

17250 Re:行集計について 桐もみ 2002/09/12-22:05
記事番号17247へのコメント
佐田先生、ご回答ありがとうございます。
そういう仕様では仕方ないですね。ご指摘の方法で努力してみます。
ありがとうございました。
17251 Re:行集計について pokopon 2002/09/13-00:59
記事番号17250へのコメント
桐もみさん こんばんは

>そういう仕様では仕方ないですね。ご指摘の方法で努力してみます。
と、あきらめずに、表の書き出しをせずとも解決できるかとお思います。

しばしお時間を!!

17252 Re:行集計について pokopon 2002/09/13-10:10
記事番号17241へのコメント
桐もみさん こんばんは

この処理は結構難しいですね。マニュアル操作も多少含みますが、下記の方法で試してみてください。
佐田さんのご紹介された方法によらなくても(外部に表を書き出さずとも)、一応処理が可能です。

■準備 作業用の項目を作成します。
[連番] 整数
[FLAG] 整数
[累計] 通貨 項目計算式は下記
    #COND(#直前値([項目B],#U)<>[項目B],[金額],1,[金額]+#直前値([累計],0))
[小計] 通貨 項目計算式は下記
    #COND([FLAG]=1,#切り上げ([累計],-4),1,#U)

■手順
1.グループごとに整列させます。
 [項目B]、[項目A]で昇順に整列させます(表示したい順で結構)
2.[連番]の項目で、置換「#連番」を行い、表示順を確定させます。
3.[連番]をキーとして、「降順」に並び替えを行います。
4.[FALG]の項目で、置換「#COND(#直前値([項目B],#U)<>[項目B],1,1,#U)」を実行します。
5.[連番]をキーとして、昇順に並び替えをします。これで、元の表示順になった筈です。
6.[累計]の項目で「項目置換」を行い、再計算させます。

以上で作業は終了です。もし、履歴登録を使えるのであれば、これらの手順を記録させておけば、
次回からは手間が省けるかと思います。

■集計行の定義
すでに「表示順」に並んでいますので(グループ順に)、「グループ項目に並べる」のチェックは外しておいたほうが安全です。
小計 [金額]の項目に #切り上げ(#合計,-4)
中計 [金額]の項目に #合計([小計])
総計 [金額]の項目に #合計([小計])
と定義して、実行してみてください。

切り上げした「小計値」の中計値が得られると思います。

・イメージ参考
↓作業1〜6を終えた状態。まだ、行集計はしていません。


↓行集計した状態。

グループごとに並び返した後、それぞれのグループ最後のレコードを知る方法(項目計算式で)があれば、
一発で行集計可能かと思うのですが、私には見つけられませんでした。
できる方、教えてください。 m(__)m
が、上記でとりあえずは目的が達成できるかと思います。

17266 Re:行集計について 幅田 2002/09/15-22:08
記事番号17252へのコメント
pokoponさん
こんにちは。
私もいつもなら、佐田さんがおっしゃっておられるように
外部に表を書き出したほうが、めんどうなようで簡単なんですが。
どうしても、その表だけで完結したいということであれば、
私ならこうするということで、
変数を使うやり方を考えてみました。

●準備 作業用の項目を作成します。
[中計] 通貨
[累計] 通貨

●集計行の定義
中計グループは[項目A]
小計グループは[項目B]

小計 [金額]の項目に #代入(&合計値,#切り上げ(#合計,−4))
    [中計]の項目に #代入(&平均値,&平均値+&合計値)
    [累計]の項目に #代入(&最大値,&最大値+&合計値)
中計 [金額]の項目に &平均値
    [累計]の項目に #代入(&平均値,0)
総計 [金額]の項目に &最大値
    [累計]の項目に #計算(#代入(&合計値,0),#代入(&最大値,0),#代入(&平均値,0))

と定義して、実行してみてください。

こんな感じになります。↓


会話処理なのであえて、変数宣言が必要のない組み込み変数を利用しました。
(一括処理なら、独自の変数を使ったほうがわかりやすいと思います)
小計用に&合計値
中計用に&平均値
総計用に&最大値
を使っております。

最初、変数をクリアする処理を入れなかったら、行集計をするたびに
どんどん前に行った集計の値が加算されていくので、
総計行で、各変数に0を代入することにより、
何度、行集計を行っても同じ値になるようにしました。

ただし、組み込み変数を使っているため、「項目集計」などを行うと
変数にその集計値が代入されてしまうので、正確な行集計は得られません。

その場合は、やはり、
&小計値
&中計値
&総計値
などという風に独自の変数を作って、変数書き出しをしておいて、
処理の前に変数読み込みをしてから行集計をするとか

[中計]もしくは[累計]などの項目に、項目計算式として

#条件選択(#行番号=1,#計算(#代入(&合計値,0),#代入(&最大値,0),#代入(&平均値,0)))

を入れておいて、
行集計の前に、メニューバーから
編集→置換→再計算
を行い、変数をクリアしてから実行すればいいかと思います。

ようするに[中計]と[累計]の項目は、行集計での計算式を設定するためだけの項目ということになりますね。
まあ、[金額]の項目の集計行に、#計算(#代入(〜 ),#代入(〜 ))などとして、
長い計算式を書いてしまえば、特に作業用の項目はいらないのですが
今回はわかりやすくするために、項目を増やして書いてみました。

17272 Re:行集計について pokopon 2002/09/16-15:27
記事番号17266へのコメント
幅田さん こんんちは

>小計 [金額]の項目に #代入(&合計値,#切り上げ(#合計,−4))
>   [中計]の項目に #代入(&平均値,&平均値+&合計値)
>   [累計]の項目に #代入(&最大値,&最大値+&合計値)

なるほど。桐は逐次行ごとに計算しますので、変数に小計の値(丸めた)を加算していけばよいわけですね。
(よくよく考えれば、当たり前のことですね。灯台下暗しでした。 (^^ゞ )

これなら、余計な並び替えも置換も必要なく、行集計するとすぐに結果が得られます。
すっきりとした解決方法です。
当初、行集計のそのままのイメージがそのまま残っており、こういう発想は出てきませんでした。


>外部に表を書き出したほうが、めんどうなようで簡単なんですが。
>どうしても、その表だけで完結したいということであれば、

そうですか? 私なら、表で書き出す前に、その表で完結する方法を先に模索いたします。
なぜなら、「行集計」を行った場合に、即在に答えを得たい訳ですし、書き出した後にさらに行集計、
そちらを使って処理となれば、かえって手間がかかるような気がします。
また、余計な作業表も後から邪魔になるわけですし。

全て、一括処理で処理すればこういった問題も解決するのでしょうし、
その「ごにょごにょ」した手法を時間をかけて考えている間に、
書き出しした方が早いと言われればそれまでですが・・・・。
一括処理や表の書き出しといった処理を普段やられていない方にとっては、どうでしょ?
毎日の業務でこれらを使うことを考えれば、「できるのであれば」表内完結型の処理がベターだと思っています。

(といって、この処理を私が使う訳ではありませんけど (^^ゞ )

17274 Re:行集計について 桐もみ 2002/09/16-17:14
記事番号17252へのコメント
佐田さん、pokoponさん、幅田さんコメントありがとうございました。
4〜5日このサイトをチェックしていない間に更なるコメントを頂いていたのに気づかなくてすみません。
早速参考にさせて頂きます。
このようなサイトがあって、やっぱり桐がいいなーと、再認識しました。(幅田さん有難う)
これからも宜しくお願い致します。

17276 Re:行集計について pokopon 2002/09/16-19:53
記事番号17274へのコメント
桐もみさん こんばんは

参考にされるのでしたら、
幅田(9/15-22:08)No.17266
の方が余計な表操作無しで即実行できます。
変数の#代入などを使っていますが、基本的に「小計の足し算」をしているだけですから。
こちらの方が、すっきりと処理可能です。
17287 Re:行集計について 桐もみ 2002/09/17-22:21
記事番号17276へのコメント
pokoponさん、時間を割いてコメント頂いたのに、お言葉に甘えて幅田さんの手法で解決致しました。
本当に有難う御座いました。これに懲りずまたご指導下さい。

戻る