
データが重複しないSQL文の書き方を教えてください。
下記のような2つのテーブルがあり、「管理番号」でOnして「使用数」をJoinさせ、かつ重複しないようにSQLを作成したいのですが、MySQLで可能でしょうか?
※0002に関しては、テーブル2の方がデータ数が多いため、Join後は2行になって「使用数」は重複せず、「数」の部分には0が入ればベストです
【テーブル1】
日付 品番 管理番号 数
2012/6/12A987 0001500
2012/6/14A987 0001300
2012/6/16A987 0001400
2012/6/18A987 0001800
2012/6/12A987 0002750
2012/6/12A987 0003540
2012/6/14A987 0003740
2012/6/16A987 0003840
2012/6/18A987 0003240
2012/6/20A987 0003640
【テーブル2】
日付 品番 管理番号 使用数
2012/7/10A987 0001160
2012/7/11A987 0001260
2012/7/10A987 0002220
2012/7/12A987 0002320
2012/7/20A987 0003530
2012/7/22A987 0003430
2012/7/24A987 0003830
【テーブルJoin】
日付 品番 管理番号 数 使用数
2012/6/12A987 0001500160
2012/6/14A987 0001300260
2012/6/16A987 00014000
2012/6/18A987 00018000
2012/6/12A987 0002750220
2012/6/12A987 00020320
2012/6/12A987 0003540530
2012/6/14A987 0003740430
2012/6/16A987 0003840830
2012/6/18A987 00032400
2012/6/20A987 00036400
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
SQLの基本がたぶんわかってないんだろうなぁ・・・という結合です
>※0002に関しては、テーブル2の方がデータ数が多いため
の箇所はロジックが破綻しているので、表示できるとしても「NULL」です
無理すれば一発でできないことはないですが、テンポラリを作りながらやると解りやすいかも。
//準備
create table テーブル1(日付 date,品番 varchar(10),管理番号 varchar(10),数 int,unique key (日付,管理番号,品番));
insert into テーブル1 values('2012-06-12','A987','0001',500),('2012-06-14','A987','0001',300),('2012-06-16','A987','0001',400),('2012-06-18','A987','0001',800),('2012-06-12','A987','0002',750),('2012-06-12','A987','0003',540),('2012-06-14','A987','0003',740),('2012-06-16','A987','0003',840),('2012-06-18','A987','0003',240),('2012-06-20','A987','0003',640);
create table テーブル2(日付 date,品番 varchar(10),管理番号 varchar(10),使用数 int,unique key (日付,管理番号,品番));
insert into テーブル2 values('2012-7-10','A987','0001',160),('2012-7-11','A987','0001',260),('2012-7-10','A987','0002',220),('2012-7-12','A987','0002',320),('2012-7-20','A987','0003',530),('2012-7-22','A987','0003',430),('2012-7-24','A987','0003',830);
//抽出SQL
create temporary table temp_t1
select (select count(*) +1 from テーブル1 AS t1b where t1a.日付 > t1b.日付 and t1a.管理番号=t1b.管理番号 and t1a.品番=t1b.品番) AS RANK,日付,品番,管理番号,数
FROM テーブル1 AS t1a;
create temporary table temp_t2
select (select count(*) +1 from テーブル2 AS t2b where t2a.日付 > t2b.日付 and t2a.管理番号=t2b.管理番号 and t2a.品番=t2b.品番) AS RANK,日付,品番,管理番号,使用数
FROM テーブル2 AS t2a;
create temporary table temp_t3
select RANK,管理番号,品番 from temp_t1 union select RANK,管理番号,品番 from temp_t2;
//表示部分
select temp_t1.日付
,temp_t3.品番
,temp_t3.管理番号
,coalesce(数,0) as 数
,coalesce(使用数,0) as 使用数
from temp_t3
left join temp_t1 on temp_t3.RANK=temp_t1.RANK and temp_t3.管理番号=temp_t1.管理番号 and temp_t3.品番=temp_t1.品番
left join temp_t2 on temp_t3.RANK=temp_t2.RANK and temp_t3.管理番号=temp_t2.管理番号 and temp_t3.品番=temp_t2.品番
order by temp_t3.管理番号,temp_t3.RANK
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ここで「interval」は どんな働...
-
SQLローダーCSV取込で、囲み文...
-
SQL*Loader Append
-
ファイルの漢数字の順番につい...
-
select文の実行結果に空白行を...
-
group byの並び順を変えるだけ...
-
VB6のオラクルのバインド変数
-
単一グループのグループ関数で...
-
レコードの登録順がおかしい
-
月末日のみソートしたい
-
BLOBやCLOBのパフォーマンスを...
-
ソート(PL/SQL)
-
【PL/SQL】FROM区に変数を使う方法
-
Oracleで「文字が無効です」の...
-
AccessのSQL文で1件のみヒット...
-
実人数と延べ人数
-
掲載日と更新日の管理の仕方
-
NULL固定として出力
-
レコードの更新履歴について
-
SELECT FOR UPDATE で該当レコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<SQL>重複しているデータの場合...
-
最新の日付と2番目の日付のデー...
-
複数のテーブルから値を合計出...
-
日付検索で0001-01-01 00:00:00...
-
NULLは表示順最下位
-
条件ごとに最大値を持つデータ...
-
直近1ヶ月に誕生日を迎える社員...
-
Mysqlで最新の日付を持つデータ...
-
月ごとの集計について
-
DISTINCTROWについてです。
-
ここで「interval」は どんな働...
-
mysqlでクロス集計を取りたいが...
-
SQLです教えてくださいお願いし...
-
SQL 重複しないJoinの仕方を教...
-
MySQLのdatetime型に0月0日を格納
-
サブクエリを使わない方法
-
mysqlでunixtimeによる日付範囲...
-
MySQLで日付(date)型のdefaul...
-
【ExcelVBA】入力された日付か...
-
MySQL「 INT」「 DATETIME」違い
おすすめ情報