• ベストアンサー

アクセス2003 SQL2000を使用してます。

いつもお世話になっています。 下記のようにAテーブルBテーブルを元に Cテーブルのようにデータを出力したいのですが、 SQL文がうかびません。 どなたか教えてください!! ●Aテーブル(取込データ)  名前  | コード1(主コード) -------------------------  小林  | 100   小林  | 102    田中  | 110   町田  | 130  木村  | 160  木村  | 160  木村  | 180 ●Bテーブル(取込データ) コード1 | コード2 ---------------------------  100   | A  110   | C   130   | D  160   | E ●Cテーブル(出力データ/ABテーブル合体させたもの) ★ ※※※を表示させたい!  ↓ここまでは表示はできている↓  名前  | コード1  | コード2 --------------------------------------------  小林  | 100    | A  小林  | 102    | ※※※  田中  | 110    | C   町田  | 130    | D  木村  | 160    | E  木村  | 160    | E  木村  | 180    | ※※※  ↓表示したい内容。不明な点。↓  名前  | コード1  | コード2 --------------------------------------------  小林  | 100    | A  小林  | 102    | A  田中  | 110    | C   町田  | 130    | D  木村  | 160    | E  木村  | 160    | E  木村  | 180    | E 以上 よろしく御願いします!!

noname#117866
noname#117866

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

#1です。 >要は、名前に対して、コード1は複数ある可能性があり、 >コード2は1つしか存在しない、のです。 「名前からコード2は一意に決まる」、これが仕様であるということならば、 SELECT a.名前, a.コード1, ISNULL(b.コード2, (SELECT コード2 FROM BTABLE WHERE コード1 IN (SELECT コード1 FROM ATABLE WHERE 名前=a.名前)) ) FROM ATABLE a LEFT OUTER JOIN BTABLE b ON b.コード1=a.コード1 なんて書き方もできますが、SQL Server 2005以降ならば以下の方法が一番楽でしょう。 SELECT a.名前, a.コード1, MAX(b.コード2) OVER (PARTITION BY a.名前) FROM ATABLE a LEFT OUTER JOIN BTABLE b ON b.コード1=a.コード1

noname#117866
質問者

お礼

お礼が遅くなり大変申し訳ございません。 教えていただいたもので出来ました! ありがとうございました!

その他の回答 (2)

  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.2

この仕様だと「名前」がキーにならざるをえないですよね? 「名前」で一意になりますか? また、同姓同名の場合はどうするのでしょうか。 [小林 100]と[小林 102]が同一人物と保証するキー項目はないのでしょうか。 この点をクリアできなければ、正しいデータはセットできませんよ。

noname#117866
質問者

補足

ご回答ありがとうございます。 そうです、名前がキーになります。 しかし、その他、社名や住所で一致させることも可能です。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

一つ例を書いておきますが、理解頂いた上で、必要な変更を掛けて頂く必要があります。 なぜなら、Aテーブルに(町田, 120)のデータがあったと仮定すると、どう出したいかわからないからです。 (つまり、仕様が明確に記載されていないということです) とりあえずは、「1つ前の有効なコードをセットする」と判断することにします。 この場合、(町田, 120)があった場合のコード2は'C'になります。NULLのままにしたいとか、'D'にしたいとかであれば、変更が必要です。 SELECT a.名前, a.コード1, ISNULL(b.コード2, (SELECT コード2 FROM BTABLE WHERE コード1 IN (SELECT MAX(コード1) FROM BTABLE WHERE コード1<a.コード1) ) ) FROM ATABLE a LEFT OUTER JOIN BTABLE b ON b.コード1=a.コード1

noname#117866
質問者

補足

早速のご回答ありがとうございました。 今回のテーブルはNULL不可なので、その点は大丈夫なのですが、 (町田,120)であった場合、'D'に表示したいのです(><) 要は、名前に対して、コード1は複数ある可能性があり、 コード2は1つしか存在しない、のです。 説明が下手で申し訳ございません。。

関連するQ&A

  • SQLを教えてください!!

    テーブルAとテーブルBがあり、両方に存在しないものを抽出してエラーとする処理を行いたいのですが、 どういうSQlを書いたらいいのか教えてください。 下記例としてテーブルにデータがあったとしたら、結果として 004 商品D 005 商品E 006 商品G というデータを抽出したいのですが・・ テーブルA             テーブルB -------------        ----------------------- コード  商品名 NO コード   商品名 001 商品A        1 001 商品A 002 商品B        2 001  商品A 003 商品C        3 002   商品B 004 商品D        4 003 商品C 006 商品G        5 003 商品C                 6 005 商品E

  • 2つのテーブルで一致しているものを抽出する。SQL文で作成。

    OS:WindowsXP SQLServer2000 <質問> SQL文が浮かばなくて困っています。 どなかたお力を貸していただけないでしょうか。 以下、やりたいことです。 【条件】 1 AテーブルとBテーブルで郵便番号が一致しているものを抽出 2 AテーブルとBテーブルに「番号」列を追加し、初期値を「0」とする 3 1の抽出後、同じ郵便番号がBテーブルに複数あった場合、   2で追加した「番号」列を0→”抽出した行分の数字”にする。 一応、【条件】1の箇所(下記)は浮かんだのですが、 2と3が分かりません。 select Aテーブル.*,Bテーブル.* from Aテーブル,Bテーブル left outer join Aテーブル on Aテーブル.郵便番号 = Bテーブル.郵便番号 WHERE ??? ●Aテーブル ID  | 名前 | 郵便番号  | 番号 ----------------------------------------------------------------- 01 |  小林 | 101-1000 | 0 02 |  鈴木 | 102-1000 | 0 03 | 田中  | 103-1000 | 0 04 | 町田  | 104-1000 | 0 05 | 木村  | 105-1000 | 0 06 | 中田  | 106-1000 | 0 ●Bテーブル ID | 分類  | 郵便番号   | 番号 --------------------------------------------------------------------- 01 | AAA  |  101-5555  | 0 03 | CCC  | 103-1000  | 0 04 | DDD  | 104-1000  | 0 05 | EEE  | 105-1000   |  0 06 | FFF  |  105-1000   | 0 07 | GGG  | 106-1000  | 0 08  | HHH  | 106-1000   | 0 09 | KKK  | 106-1000   | 0 ↓出したい結果↓ ID  | 名前 | 郵便番号   | 分類  | 番号 ------------------------------------------------------------------------------- 03 | 田中 | 103-1000  | CCC   |  0 04 | 町田 | 104-1000  | DDD  |  0 05 | 木村 | 105-1000  | EEE  |  2 05 | 木村 | 105-1000  | FFF  |  2 06 | 中田 | 106-1000  | GGG  |  3 06 | 中田 | 106-1000  | HHH  |  3 06 | 中田 | 106-1000  | KKK  |  3 以上になります。 どうぞよろしくお願い致します。

  • こんなSQLを教えてください

    こんなSQLを教えてください <更新前> テーブル1 |キー|コード| | 1|  a| | 2|  b| | 3|  c| テーブル2 |キー|コード| | 2|  B| | 4|  D| <更新後> テーブル1 |キー|コード| | 1|  a| | 2|  B| | 3|  c| こんなふうに テーブル1と同じデータがテーブル2にあったら テーブル1を書き換えるUPDATE文を教えてください

  • ACCSESSのSQLで教えてください。

    すみません! SQL初心者なのですが教えてください。 下記のようなtableというテーブルなのですが こちらのテーブルをデータが増加しても(1)から(2)のように select表示させるにはどうすればよいか教えて頂けないでしょうか・・・。 何卒よろしくお願い致します。 テーブル名:table カラム名:NO,kigou (1) table |NO|kigou| |1 |a | |2 |b | |3 |c | |4 |d | |5 |e | ↓ (2) |NO1|kigou1|NO2|kigou2|NO3|kigou3| |1 |a |2 |b |3 |c | |4 |d |5 |e | ・・・

  • SQL文で

    すみません。質問させてください。 A,B,C,D,Eと5個のフィールドで構成されたテーブルtableがあるとします。 tableにはデータがすべて格納され(NULLなし)ています。 ですが、フィールドA,C,DについてA,C,Dとも同じデータが格納される ことがあります。 その重複したデータ以外を取得したいのですが (要するにフィールドA,C,Dでユニークのデータのみ取得) SQL文でどのように書けばいいかわかりません。 よろしくお願いいたします

  • Oracle10gのSQL文についての質問です。

    Oracle10gのSQL文についての質問です。 [A]テーブルに CODE(key) NAME と、フィールドがあります。 A NAME-A B NAME-B C NAME-C D NAME-D E NAME-E と、データが入っています。 [B]テーブルに CODE(key) LINE(key) BIKO と、フィールドがあります。 A 1 BIKO-A-1 A 2 A 3 BIKO-A-3 B 1 B 2 B 3 C 1 C 2 BIKO-B-2 C 3 D 1 BIKO-D-1 D 2 BIKO-D-2 D 3 BIKO-D-3 E 1 E 2 E 3 BIKO-E-3 と、データが入っています。 結果が CODE(key) LINE(key) BIKO と、フィールドがあります。 A 1 BIKO-A-1 A 2 BIKO-A-1 A 3 BIKO-A-1 B 1 (null) B 2 (null) B 3 (null) C 1 BIKO-B-2 C 2 BIKO-B-2 C 3 BIKO-B-2 D 1 BIKO-D-1 D 2 BIKO-D-1 D 3 BIKO-D-1 E 1 BIKO-E-3 E 2 BIKO-E-3 E 3 BIKO-E-3 と、したいのです。 つまり、[B]テーブルのLINEが一番小さいBIKOが欲しいのです。 色々と考えてみましたが、解りません。 宜しくお願い致します。

  • アクセスレポートのNextRecordについて

    アクセス2000を使用しています。 レポートのNexrRecordプロパティの中身が分からないので 教えてください。  以下のテーブルを元にレポートを作成しました。 ****************************** テーブル名:Tテスト ID 名前  (←フィールド名) ------------------------------ 1 田中 2 佐藤 3 鈴木 4 小林 5 大橋 ****************************** レポートの詳細セクションで2件目の フォーマット時、NextRecordをfalse にしましたところ、以下のように出力 されました。 「出力結果」 1 田中 2 佐藤 3 鈴木 4 小林 5 大橋 つまり、テーブルの内容がそのまま出力されました。 素人考えでは、 1 田中 2 佐藤 2 佐藤 3 鈴木 4 小林 5 大橋 なるものとばかり思っておりました。 NextRecordがいつどのように働くのか詳しく教えて いただきたいと思うのですが、どうぞよろしくお願い いたします。 (レポートのセクションの実行順がよくわかりません)

  • SQLの書き方

    当事業所の健康診断管理をVB.Netで行おうとしています 下記ののようなDB内容で『c』のみ検査するスタッフを抽出するSQLはどのようになりますか? フィールド:社員ID、名前、検査種別        0001、中川、A        0001、中川、B        0001、中川、C        0002、木村、A        0002、木村、C        0003、大野、C        0004、田中、A        0004、田中、C        0005、山田、A        0005、山田、B 抽出後は『0003、大野、C』としたいのですが… なかなかいいアイデアがでてきません 独学で勉強しているのですが、うまく処理させることができません (かなりの遠回りでなら処理可能なんですが:汗) ご教授お願いします。

  • SQL コマンド

    データの変換するコマンドを教えてください A|B ==== 1|A 2|B 3|C 4|A 5|D 6|A 7|D というテーブル内容を以下のように出力したいです。 だれがよいコマンドを教えてくださいませんか。 A B C D 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1

  • ある条件でのSQLの取得方法について

    以下の条件でのSQLのデータの取得方法が分かりません。 2つのテーブルがあるとします。 ・テーブルA キー   項目1 10     X 20     Y ・テーブルB キー  項目2  項目3 10     5    C 10     6    D 12     6    E ここで取得する条件として ■テーブルAにあるのは、必ず取得します。 ■テーブルAのキーとテーブルBのキーは繋がり、繋がったテーブルBの情報は  別レコードとして取得します。 ■テーブルAのキー1つに対して、テーブルBのキーは無いかも知れないし、  複数件あるかも知れません。  無い場合はテーブルAの情報のみを出力し、複数件ある場合はその全てを出力します。 ■テーブルBの項目2が同じ値のデータがある場合、テーブルBを出力したレコードと  同じレコードに、項目2が同じデータの情報を出力します。  項目2が同じデータが無い場合はこの情報は出力しません。  項目2が同じ値のデータは最大2件しかありません。 上記の例の場合に出力したい結果 ・出力テーブルC キー  フラグ   項目1  項目2  項目3   項目2が同じキー  項目2が同じ値 10  テーブルA   X 10  テーブルB         5    C 10  テーブルB         6    D        12            E 20  テーブルA   Y (テーブルC のフラグとは、テーブルAの情報かテーブルBの情報かを示します) これを出来ればSQL、出来なければPL/SQLで取得したいのですが どちらの場合でも取得の方法に悩んでいます。 どのような方法で取得できるのでしょうか?