過去の桐井戸端BBS (桐ver.8)
15381 2つのレコードを1つにしたい macoto 2002/03/07-16:28
表の操作につきまして教えていただきたいと思います。
Ver8 sp6を使用しています。

さて、表のある項目(ID)で同一の値を持つ2つのレコードがあった場合に、
そのキー項目をもとに1つのレコードにしたいと思っています。
具体的には、下記のような具合です。


ID 項目1 項目2
---------------------
001 A   10
001 B   20    (*項目1はA,Bの2つしかないと規定します)

↓↓

ID 項目A 項目B
---------------------
001 10   20


このような場合は、項目1のA,Bで絞り込んで、それぞれを別の表に書き出して、
それらを結合もしくは併合すれば良いような気がしているのですが、
もっとスマートで簡便な方法というものはないでしょうか。
ご教示いただければ思います。
15383 Re:2つのレコードを1つにする方法(再送) masa 2002/03/07-17:11
記事番号15382へのコメント
macotoさん 今晩は。

やっぱり結合もしくは併合がスマートの気がしますよ。(ABしかないので
一項目追加して計算式にBでキーが同じならBの値を表示させて、
計算式を削除後、AB入っている項目からBだけ削除すればと思ったのですが
自分自身は表引きできないんですよね。)

15384 Re:2つのレコードを1つにする方法 野良犬 2002/03/07-18:02
記事番号15381へのコメント
転置集計では?
15388 Re:2つのレコードを1つにする方法 佐田 守弘 2002/03/07-22:44
記事番号15381へのコメント
macotoさん
質問内容にいくつか確認事項があります。
●IDはグループ化するための項目ですか
>ID 項目1 項目2
>---------------------
>001 A   10
>001 B   20    (*項目1はA,Bの2つしかないと規定します)
ですが、通常IDは重複しない番号をふるのが普通です。あえて重複させているのは
 001 A   10
 001 B   20 
 001 A   30
 001 B   40 
 002 A   10
 003 B   20 
の様な時、

>ID 項目A 項目B
>---------------------
>001 40   60
>002 10   0
>003 0   20

の様に、ID毎にまとめて項目AとBを集計(合計)するのでしょうか。
そうだとすれば、のら犬さんもか苅れている通り、転置集計です。
転置集計の設定は、
グループ項目:[ID]
転置項目  :[項目1]
集計項目  :[項目2] (合計で集計する)
です。

もしIDは単なる連番であって、集計に関係無いとすると、
どの様にまとめたいのかをもう少し詳しくお知らせ下さい。

佐田守弘(KS-00119)
15392 Re:2つのレコードを1つにする方法 macoto 2002/03/08-09:40
記事番号15388へのコメント
佐田守弘さん、こんにちは。いつもお世話になっております。
このたびも有難うございます。

>質問内容にいくつか確認事項があります。
>●IDはグループ化するための項目ですか

IDは個人の固有の番号です。そして「項目1」にはAとBの2つしか入らないものとします。
そして、(書き忘れていたのですが・・・)そのレコードは、日付によって纏められています。

date   ID  項目1  項目2
-----------------------------
01-01  001   A    10
01-01  001   B    20
  
01-01  002   A    30
01-01  002   B    40
 
02-12  001   A    50
02-12  001   B    60
 
03-13  002   A    70

04-14  003   B    80
 
04-14  004   A    90

      ↓↓
の様な表を下記のような表にしたいと考えています。
      ↓↓

date   ID  項目A  項目B
-----------------------------
01-01  001   10   20
01-01  002   30   40  
02-12  001   50   60
03-13  002   70 
04-14  003       80
04-14  004   90

最初から下段のような表を定義すればよかったのですが、今までの経緯もあって
上段のような定義の表になっています。それを下段のように変えたいと思っております。
宜しくご教示ください。

15396 縦を横に natsu 2002/03/08-19:52
記事番号15392へのコメント
転置集計や併合で十分いけると思いますが、転置集計の場合
何らかの原因である項目のデータが、いずれのレコードにも出現しなかった場合、
転置集計の結果得られる表の項目が欠ける場合があります
(たとえば、項目Bは何らかの原因で行われていなかった)

始めに、項目が欠けているか確認してダミーの行を追加してから
転置集計を実行してもいいと思いますが、ちょっとオシャレじゃないです
併合も、A、Bだけならいいのですが数が多くなると、これも大変

一括処理を簡単にしようと思えば、以下のようになると思います
今までのmacotoさんの投稿から勝手に推測して、少し項目名を変えました

やり方
始めにデータが入っている表を元表.tblとします
[日付][ID][項目名][データ]
[項目名]がオリジナルの[項目1]、[データ]が[項目2]になります

最終的に目標とする表をあらかじめ作成しておく(結果.tbl)
[日付][ID][項目A][項目B]・・・[項目Z]
項目Aや項目Bは、元表.tblで出現する[項目名]の項目値のままとします

***************************************
表 "元表"
絞り込み 単一化={[日付],[ID]} 
書き出し 表,"結果",{[日付],[ID]} /* これで対象レコードが得られます */
表 "結果"
並べ替え {[ID]昇順,[日付]昇順}  /* あとの処理のためです */
編集表 "元表"
ジャンプ 行番号=先頭
&ID=-1  /*[ID]は整数型とします 先頭行の処理のため絶対使用しない数を入れます*/
&日付=d"1900/1/1"  /* 日付も同様です */

繰り返し ( .not #終端行)

ケース開始
 ケース (&ID≠[ID] .and &日付≠[日付])
&ID=[ID]
  &日付=[日付]
  &項目名=[項目名]
  &データ=[データ]
  編集表 "結果"
  検索 [ID]{ &ID }
  検索 [日付]{ &日付 } /* これで処理対象行にたどり着きます 絞り込みより速いかも*/
  コマンド "行訂正 [" + &項目名 + "]=" + &データ 
 ケース その他  /* 元表が同じ日付・IDなら結果.tblの処理対象行を動かす必要ありません
 */
  &項目名=[項目名]
  &データ=[データ]
  編集表 "結果"
  コマンド "行訂正 [" + &項目名 + "]=" + &データ 
ケース終了

編集表 "元表"
ジャンプ 行番号=次行
繰り返し終了

***************************************

今回はテストしていません
あしからず

15397 重箱の隅(^^;) 悲しげ 2002/03/08-21:23
記事番号15396へのコメント
どもっ、natsuさん

>今回はテストしていません
>あしからず

と云うことで、重箱の隅です。(^^;)

>  検索 [ID]{ &ID }
>  検索 [日付]{ &日付 }

じゃなくて、
  検索 [ID]{ &ID }
  検索 ↓,[日付]{ &日付 }
とすべきなんじゃないでしょうか?(^^;)

あるいは検索を一発で済ませたければ
  検索 [ID]=#条件選択([ID]=&ID .and [日付]=&日付,[],[],#U,1,1)

あるいは結果を求める表に次のような検索条件(検索条件登録に
先立って変数を宣言しておく必要あるかも?)
  [ID]項目に &ID
  [日付]項目に &日付
を登録しておいた上で
  検索 条件名="某検索条件名",終了状態=&実行リターン
とすることもできようかと思います。
15398 Re:縦を横に (素晴らしいです) macoto 2002/03/08-21:57
記事番号15396へのコメント
natsuさん、先日は大変お世話になり有難うございました。
前回の「血液センターのような…」は、教えていただいた一括コマンドを加えて
バッチリ動いています。とても嬉しいです。

今回もまさに「縦を横に」のイメージなんです。
これも前述の上段の表から下段の表へデータ移行をしたかったのですが、
どうしてもうまくいかず、属性だけを先に移行して、データは手で入力しようと考えていました。

>一括処理を簡単にしようと思えば、以下のようになると思います
>今までのmacotoさんの投稿から勝手に推測して、少し項目名を変えました

また、また一括プログラムを作成していただき、感謝、感謝です。
完全に理解できていませんが、私が目指しているものに間違いありません。
明日の朝から出張なものですから、帰ってくる来週から教えていただいたプログラムを
ベースに本格的に取り組んでみたいと思います。

このような「縦を横に」する処理は、いろいろと応用が出来そうですね。
最初は簡単と思ったのですが、いざ取り組んでみると意外と難しいんです。

本当に「natsuさん」は素晴らしいスキルと発想をお持ちの方なんですね。
また、宜しくお願いいたします。有難うございました。

15402 Re:重箱の隅(^^;) natsu 2002/03/08-23:37
記事番号15397へのコメント
悲しげさん 毎度どうもありがとうございます

>  検索 [ID]{ &ID }
>  検索 ↓,[日付]{ &日付 }
>とすべきなんじゃないでしょうか?(^^;)

はい その通りでございます
矢印 抜けてました
15407 転地集計 尾形 2002/03/09-11:59
記事番号15396へのコメント
表 "結果" に読み込む形式にすれば
「B」のレコードが存在しなくても大丈夫と思います
でも、未確認です (^^;

表 "元表"
転置集計 {[DATE],[ID]},[項目1],[項目2],集計種別=合計,整列=する
代入 &秒=#IS表 /*&表番号の確保*/
表 "結果"
行削除 *,圧縮
読み込み 表,&秒,*


15420 Re:転地集計 macoto 2002/03/11-09:19
記事番号15407へのコメント
尾形さん、こんにちは。
コメントを有難うございます。

>転置集計 {[DATE],[ID]},[項目1],[項目2],集計種別=合計,整列=する

私の表の書き方が悪かったと思いますが、[項目2]のデータの合計を転置集計するわけではなく、
《元表》のデータをそのまま《結果表》へ持って行きたかったのです。
その場合には、上記のような転置集計ではできないように思うのですが。
下記の表は少し分かりやすく変更したものです。

《元表》
date   ID  項目1  項目2
-----------------------------
01-01  001   A    ア
01-01  001   B    イ
  
01-01  002   A    ウ
01-01  002   B    エ
 
02-12  001   A    オ
02-12  001   B    カ
 
03-13  002   A    キ

04-14  003   B    ク
 
04-14  004   A    ケ

      ↓↓
      ↓↓

《結果表》
date   ID  項目A  項目B
-----------------------------
01-01  001   ア   イ 
01-01  002   ウ   エ  
02-12  001   オ   カ
03-13  002   キ 
04-14  003       ク
04-14  004   ケ

15421 「コマンド」コマンドの使い方がポイントですね macoto 2002/03/11-09:29
記事番号15396へのコメント
natsuさん、こんにちは。

出張中もnatsuさんに書いていただいた一括プログラムをじっくり見ていました。
おかげさまですべて理解することができました。
この「コマンド」コマンドの使い方がポイントなのですね。
あることは知っていたのですが、どのような時どのような使い方をすればよいのか分からないでいました。

>コマンド "行訂正 [" + &項目名 + "]=" + &データ

かさねてお礼申し上げます。有難うございました。

15422 Re:転地集計 尾形 2002/03/11-10:45
記事番号15420へのコメント
>その場合には、上記のような転置集計ではできないように思う
>のですが。下記の表は少し分かりやすく変更したものです。
ならないですか?
文字列なんですかね

まぁ、解決済みのようですのでいいでけど (^^;


15424 縦を横に 訂正3カ所 natsu 2002/03/11-17:07
記事番号15396へのコメント
悲しげさんにも↓のご指摘をいただきましたが
自分でもこの処理を使う用事が出てきて、一括処理を作成していたら
あと3カ所ほど、訂正部分が出てきました

>表 "元表"
>絞り込み 単一化={[日付],[ID]} 
>書き出し 表,"結果",{[日付],[ID]} /* これで対象レコードが得られます */
ここで 絞り込み解除を入れて、 [ID]と[日付]で並べ替えを行ってください


>ケース開始
> ケース (&ID≠[ID] .and &日付≠[日付])
ここなんですが、これだと同じIDでも日付が変わらないと対象行が移動しません
.and を .or に変更です

>  コマンド "行訂正 [" + &項目名 + "]=" + &データ 
これですが、&データのままだと、だめです
&データは文字列ですが、コマンドコマンドはあくまでも、そのままの文字列で作動します
&データを"で囲めばいいのですが、ややこしいので &dq="""という変数を定義します
&データを&dq+&データ+&dqとすればOKです

以上です
15425 """を文字変数とするテクニック macoto 2002/03/12-09:49
記事番号15424へのコメント
natsuさん、おはようございます。

私も昨日から自分のシステムに合うように手直しをしており、ご指摘いただいた
点は直して一括プログラムを作成しました。

>>  コマンド "行訂正 [" + &項目名 + "]=" + &データ 
>これですが、&データのままだと、だめです
>&データは文字列ですが、コマンドコマンドはあくまでも、そのままの文字列で作動します
>&データを"で囲めばいいのですが、ややこしいので &dq="""という変数を定義します
>&データを&dq+&データ+&dqとすればOKです

&データのままだと駄目なんですよね。
"""という文字列をいれておりましたが、やたら長くて締まらない記述になっちゃって・・・
&dq="""というテクニックがあるんですね。
これも素晴らしい発想です。これも他にいろいろと使えそうです。
有難うございました。

15427 Re:"""を文字変数とするテクニック natsu 2002/03/12-11:53
記事番号15425へのコメント
これは、HTMLの特殊文字のパクリです
HTMLでも、タグで使用している文字を、文字として表示したい場合
特殊文字として表記しているらしいです

戻る