質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

Q&A

解決済

2回答

5599閲覧

SQLでN:Nのレコード結合について

seesaajira-

総合スコア107

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

0グッド

0クリップ

投稿2018/11/22 06:59

編集2018/11/22 07:42

以下のように日々の仕入、売上を比較する一覧表を出力したいです。

【求める出力結果】

イメージ説明

仕入は日によって有ったり無かったりします。
売上も日によって有ったり無かったりします。
仕入も売上も無い日もあります。

データは以下のような感じです。

【仕入テーブル】

|仕入日| 商品コード|荷姿コード|重量|仕入金額|
|:--|:--:|--:|
|2017/08/01| 00000751| 2| 1068| 215514
|2017/08/01| 00000751| 3| 651| 6546
|2017/08/03| 00000751| 2| 1476| 311248
|2017/08/04| 00000751| 2| 1956| 424517
|2017/08/05| 00000751| 2| 2208| 458671
|2017/08/07| 00000751| 2| 2100| 459798

【売上テーブル】

|売上日| 商品コード|荷姿コード|重量|売上金額|
|:--|:--:|--:|
|2017/08/01| 00000751| 4| 18.2| 4185
|2017/08/01| 00000751| 3| 7| 1540
|2017/08/01| 00000751| 2| 1512| 335575
|2017/08/02| 00000751| 4| 10| 2385
|2017/08/02| 00000751| 2| 1080| 244175
|2017/08/02| 00000751| 3| 8| 1760
|2017/08/03| 00000751| 3| 6| 1320
|2017/08/03| 00000751| 4| 14| 3310
|2017/08/03| 00000751| 2| 1308| 293470
|2017/08/04| 00000751| 2| 1116| 249695
|2017/08/04| 00000751| 3| 11| 2420
|2017/08/04| 00000751| 4| 5| 1250
|2017/08/07| 00000751| 2| 1080| 2420

以下のような方法でSQLを作成したのですが、イメージした結果になりません。
他に良い案があれば教えて下さい。

日々の動きが見たいので、日付テーブルに結合させてみました。

【日付テーブル】

|日付|
|:--|:--
|2017/08/01|1日から
|2017/08/02|
|2017/08/03|
|2017/08/04|
|2017/08/05|
|2017/08/06|
|2017/08/07|
|2017/8/30|末日まで

結合イメージ

SELECT 日付テーブル.日付, 仕入テーブル.商品コード, 仕入テーブル.荷姿コード, 仕入テーブル.重量, 仕入テーブル.金額    , 売上テーブル.商品コード, 売上テーブル.荷姿コード, 売上テーブル.重量, 売上テーブル.金額 FROM 仕入テーブル RIGHT JOIN (売上テーブル RIGHT JOIN 日付テーブル ON 売上テーブル.売上日 = 日付テーブル.日付) ON 仕入テーブル.仕入日 = 日付テーブル.日付;

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2018/11/22 07:02

サンプルデータは画像ではなくテキストで貼って下さい
maisumakun

2018/11/22 07:03

DBエンジンはSQL Server(一般名ではなく、マイクロソフトの製品名です)で間違いないですか?
kaba

2018/11/22 07:04

日付テーブルに8/5と8/7が無いのはなぜですか?
kaba

2018/11/22 07:08

仕入テーブルと売上テーブルで一致させたい項目は何ですか?(日付だけではないように感じます)
seesaajira-

2018/11/22 07:20

SQLSERVER バージョン2012で開発を行っております
seesaajira-

2018/11/22 07:21

日付テーブルは1~末日まであると仮定して下さい
seesaajira-

2018/11/22 07:22

出来れば、日付+商品コード+荷姿コードで一致して頂ければと思います
x_x

2018/11/22 07:41

W_DATEはどこから出てきたのでしょうか?
guest

回答2

0

SQL

1select 日付テーブル.日付 2 , 仕入商品コード, 仕入荷姿コード, 仕入重量, 仕入金額 3 , 売上商品コード, 売上荷姿コード, 売上重量, 売上金額 4from 日付テーブル left join ( 5 select coalesce(仕入日, 売上日) as 取引日 6 , 仕入テーブル.商品コード as 仕入商品コード, 仕入テーブル.荷姿コード as 仕入荷姿コード, 仕入テーブル.重量 as 仕入重量, 仕入テーブル.金額 as 仕入金額 7 , 売上テーブル.商品コード as 売上商品コード, 売上テーブル.荷姿コード as 売上荷姿コード, 売上テーブル.重量 as 売上重量, 売上テーブル.金額 as 売上金額 8 from 仕入テーブル full outer join 売上テーブル 9 on 仕入テーブル.仕入日 = 売上テーブル.売上日 10 AND 仕入テーブル.商品コード = 売上テーブル.商品コード 11 AND 仕入テーブル.荷姿コード = 売上テーブル.荷姿コード 12 ) as 取引 13 on 日付テーブル.日付=取引.取引日

投稿2018/11/22 08:56

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seesaajira-

2018/11/22 10:57

saziさん、回答ありがとうございました。 今回はkabaさんの方法でうまくいきましたので、 申し訳ございませんがkabaさんの方法を採用させていただきました。 またの機会がございましたら宜しくお願い致します。
guest

0

ベストアンサー

SQLSERVERがFULL JOINに対応しているなら、以下が一番簡潔な記述です

SQL

1SELECT 2IFNULL(仕入テーブル.仕入日, 売上テーブル.売上日) AS 日付, 仕入テーブル.商品コード, 仕入テーブル.荷姿コード, 仕入テーブル.重量, 仕入テーブル.金額 3, 売上テーブル.商品コード, 売上テーブル.荷姿コード, 売上テーブル.重量, 売上テーブル.金額 4FROM 仕入テーブル 5FULL JOIN 売上テーブル ON 仕入テーブル.仕入日 = 売上テーブル.売上日 AND 仕入テーブル.商品コード = 売上テーブル.商品コード AND 仕入テーブル.荷姿コード = 売上テーブル.荷姿コード 6

投稿2018/11/22 07:37

kaba

総合スコア314

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seesaajira-

2018/11/22 10:59

kabaさん、ありがとうございました。 無事おもったような結果が出せました。 おかげで日付テーブルを作る必要性が無くなりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問