- ベストアンサー
Access SQL 全てのレコードを出力
こんばんは。 SQL初心者です。 SQLを作成していたのですが、なかなか上手く行かずに頭がこんがらがってきてしまいました。 どなたかご教授お願いできないでしょうか? 例えば、8/22の入出金状況がTableA,TableBの様な状況だとするとTableCを出力するにはどのようなSQLを書けば良いのでしょうか? TableA [銀 行],[入 金] UFJ,5000 MIZUHO,4000 RISONA,2500 SINSEI,3000 TableB [銀 行],[出 金] UFJ,3000 MIZUHO,1500 RISONA,1000 AIWA,6000 ↓ TableC [銀 行],[入 金],[出 金] UFJ,5000,3000 MIZUHO,4000,1500 RISONA,2500,1000 SINSEI,3000,0 AIWA,0,6000 基本的なSQLなのかもしれないですが、よろしくお願いいたします。 WindowsXP,Access2000の環境です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
SELECT BANK.銀行 ,IIF(TableA.入金 IS NULL,0,TableA.入金) AS 入金 ,IIF(TableB.出金 IS NULL,0,TableB.出金) AS 出金 FROM ( ( SELECT 銀行 from TableA UNION SELECT 銀行 from TableB ) BANK LEFT JOIN TableA ON BANK.銀行 = TableA.銀行 ) LEFT JOIN TableB ON BANK.銀行 = TableB.銀行 ※利用時注意事項 見易さのために、全角スペースを利用しています。 アクセスクエリなどに張るときは、全角スペースを半角スペースに置換する必要があります。 ※説明 ↓この部分は銀行名一覧を作成しています。 SELECT 銀行 from TableA UNION SELECT 銀行 from TableB これをマスタとして扱います。 それから「≪マスタ≫ LEFT JOIN ≪ワーク≫ ON [結合式]」を利用し 銀行名一覧の銀行と入金テーブルの銀行名を結合 さらに 銀行名一覧の銀行と出金テーブルの銀行名を結合 を行います。 あとは表示したい項目を、先頭でSELECTするだけです。 ただし、入金/出金テーブルには、臨時作成したマスタに存在しない銀行があるので、IIFを利用しNULL回避を行っています。 ※アドバイスっぽいこと 出力順序は違いますが、銀行コードか何かが本来あるのであれば、それを利用して出力順序を定めた方がいいかも?です。 #2さんが言われているsum関数についてですが、私も納得です。 その際には、 >LEFT JOIN >TableA >ON BANK.銀行 = TableA.銀行 としてではなく LEFT JOIN ( SELECT 銀行, Sum(入金) AS 入金計 FROM TableA GROUP BY 銀行 ) 入金合算 ON BANK.銀行 = 入金合算.銀行 として、入金合算と銀行名を結合していく方法もあります。
その他の回答 (3)
- angband
- ベストアンサー率51% (86/168)
#1さんの回答ですが、TableAとB、どちらかにしかない銀行があるので inner join では無理だと思います。 銀行名が全部入ってるテーブルがあれば AとBを left join すればいいと 思います。
お礼
こんばんは、ご回答ありがとうございます。 >銀行名が全部入ってるテーブルがあれば AとBを left join すればいいと思います。 1050YENさんから教えてもらったUNIONでTableA,TableBを結合してマスタを作ることができました。 その後にLeft Joinした訳ですが、結構頭がこんがらがりました。SQLって難しいですね。
- osamuy
- ベストアンサー率42% (1231/2878)
まずは銀行でgroup byして、入金のsum()を計算するクエリを作って、同様に銀行別出金合計を求めるクエリを作ります。 しかるのち、両クエリを銀行でjoinすればいけるのではないかと。
お礼
ご回答ありがとうございます。 SELECT 銀行, Sum(入金) AS 入金計 FROM TableA GROUP BY 銀行; SELECT 銀行, Sum(出金) AS 出金計 FROM TableB GROUP BY 銀行; のクエリを実行して、 お互いを left Join すれば良いということですね。 SQLには、沢山のやり方があるんですね。それだけに難しいんだと実感しました。
- hideto_urata
- ベストアンサー率0% (0/2)
select TableA.銀行,TableA.入金,TableB.出金 into TableC from TableA inner join TableB on TableA.銀行 = TableB.銀行;
お礼
ご回答ありがとうございます。 TableAとTableBにはお互いのテーブルには存在しない銀行があるのでUNIONで全ての銀行が存在するマスタを作成してjoinすれば上手くいくと教えてもらいました。 SQLって難しいですね。
お礼
こんばんは、お久しぶりです。 実はこの間もfilsearchObjectの件で回答いただきました。その節はお世話になりました。 今回のSQLの件ですが、1050YENさんのSQLを参考にして上手く処理することができました。 UNIONで銀行マスタを作成するというアイディアはまったく思いつきませんでした。 またまた、勉強させていただきました。 2度目の大感謝です。ありがとうございますm(._.)m