
データが重複しない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ランキング
-
【ExcelVBA】入力された日付か...
-
SQLで、同じ値が何回連続す...
-
LIKE検索で範囲指定の方法
-
SQLローダーCSV取込で、囲み文...
-
単一グループのグループ関数で...
-
Oracleで「文字が無効です」の...
-
テーブルの最後(最新)のレコー...
-
引数によってwhere句を切り替え...
-
AccessのSQL文で1件のみヒット...
-
SQL*Loader Append
-
1の行を固定した上でVBAを用い...
-
タイムスタンプ型を抽出条件に...
-
SELECT FOR UPDATE で該当レコ...
-
アクセスのレポートでレコード...
-
コンボボックスのソートについて
-
select文の実行結果に空白行を...
-
トランザクションログを出力せ...
-
1レコード全てを改行なしで表...
-
BLOBやCLOBのパフォーマンスを...
-
ファイルの漢数字の順番につい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<SQL>重複しているデータの場合...
-
複数のテーブルから値を合計出...
-
最新の日付と2番目の日付のデー...
-
【ExcelVBA】入力された日付か...
-
LIKE検索で範囲指定の方法
-
項目以外の文字列は連結できま...
-
日付
-
Mysqlについて、どの程度の処理...
-
SQLで、同じ値が何回連続す...
-
検索を繰り返す?
-
日付
-
mysqlでunixtimeによる日付範囲...
-
MySQLにおける条件/公開日を指...
-
PHPとMYSQLを使用したデータベ...
-
日付検索で0001-01-01 00:00:00...
-
windows7のmysqlで今日の日付か...
-
型変換
-
効率の良いSQL文の書き方を教え...
-
SQLです教えてくださいお願いし...
-
日付や日時を格納する場合の型...
おすすめ情報