売上1件1件の発生日時を記録したテーブルAと、売上1件1件の金額を記録したBという2つのテーブルがあるのですが、AからBへはコードではなく次のように行番号によってレコードを参照しているという状況です。
[テーブルA(売上日時データ)のフィールド]
・顧客コード
・売上発生日時
・行番号
(「行番号」は、テーブルB内から該当顧客に対するレコードを抽出したとき、その中の何番目のレコードがこのレコードに対応するかを表す)
[テーブルB(売上金額データ)のフィールド]
・顧客コード
・金額
これら2つのテーブルを元に「顧客コード」「売上発生日時」「金額」を並べた情報を取得したいのですが、「SELECT」一発で決まるようなスマートな方法はあるでしょうか?
一応、ACCESSでの話ですが、SQLの一般論でも結構です。テーブルA、Bの構造は変えることはできないので、DBの設計からやり直せ、という回答はご遠慮ください。
★ 補足のため具体例を画像として添付します。
コメントに有るように入力日時カラムが存在し、同じ顧客コードで同一時刻は無いものとして扱います。(出なければまともに検索できませんので)
また、入力日時は昇順で行番号を振ります。
SELECT A.顧客コード,A.売り上げ発生日時, B.金額 FROM テーブルA AS A JOIN ( SELECT 顧客コード,金額, ( SELECT count(*) FROM テーブルB AS B2 WHERE B2.入力日時 < B1.入力日時 )+1 AS 行番号 FROM テーブルB AS B1 ORDER BY B1.入力日時 ) AS B USING ( 顧客コード,行番号 );
Access で動くかどうかは試してないので分かりません。
コスト度外視なのは元の設計が原因なので諦めてください。
LEFT JOIN 等でテーブルを結合すればいいのではないでしょうか?
http://makotowatana.ld.infoseek.co.jp/access/dasqlleftrightjoin....
SELECT テーブルA.顧客コード, テーブルA.売り上げ発生日時, テーブルB.金額 FROM テーブルB LEFT JOIN テーブルA ON テーブルB.顧客コード = テーブルA.顧客コード
上記の例ですと、テーブルB側のレコードが一意に特定されないためうまくいかないのではないでしょうか?
質問者:you1982 2007-01-29 16:26:43
上記の例ですと、テーブルB側のレコードが一意に特定されないためうまくいかないのではないでしょうか?
テーブルBに一意に特定できる主キーのようなものが示されていないので、
一意に特定できないのはいたしかたないかと思います。
テーブルBが何の順番で並んでいるのかもよく分かりませんし。
そのような状況下で何とかしたい、というのが質問の趣旨でした。
コメントで触れたのですが、テーブルBのソート順については一意にソート可能と考えてください。
コメントに有るように入力日時カラムが存在し、同じ顧客コードで同一時刻は無いものとして扱います。(出なければまともに検索できませんので)
また、入力日時は昇順で行番号を振ります。
SELECT A.顧客コード,A.売り上げ発生日時, B.金額 FROM テーブルA AS A JOIN ( SELECT 顧客コード,金額, ( SELECT count(*) FROM テーブルB AS B2 WHERE B2.入力日時 < B1.入力日時 )+1 AS 行番号 FROM テーブルB AS B1 ORDER BY B1.入力日時 ) AS B USING ( 顧客コード,行番号 );
Access で動くかどうかは試してないので分かりません。
コスト度外視なのは元の設計が原因なので諦めてください。
ありがとうございます!
まだACCESSで試していませんが、効率はともかく、たぶんこれが1番、簡単なSQL文のように見えますね。
おそらくこのb-windさんのご回答で問題解決だと思うのですが、引き続き、Access独自の方法やあるいは裏技(?)的にダイレクトに行番号から引っ張れるような方法がありましたらお願い致します。
ありがとうございます!
まだACCESSで試していませんが、効率はともかく、たぶんこれが1番、簡単なSQL文のように見えますね。
おそらくこのb-windさんのご回答で問題解決だと思うのですが、引き続き、Access独自の方法やあるいは裏技(?)的にダイレクトに行番号から引っ張れるような方法がありましたらお願い致します。