• 締切済み
  • 困ってます

SQL 重複しないJoinの仕方を教えてください

データが重複しない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

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数935
  • ありがとう数0

みんなの回答

  • 回答No.1
  • yambejp
  • ベストアンサー率51% (3827/7415)

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

  • SQL LEFT JOIN

    SQLでわからないことがあるので質問させていただきます。 例えばの話ですが在庫テーブルというテーブルがあってそこに商品マスタ をLEFT JOINする際に SELECT *  FROM 在庫テーブル LEFT JOIN 商品マスタ ON 品番 = 品番 として実行すると返ってくる結果は在庫テーブルの全レコードと 品番で結んだ商品マスタに存在するデータってことですか? 上記のSQLと SELECT * FROM 在庫テーブル で返ってくるレコード件数が違うという時はどういう可能性が考えられるでしょうか? ちなみに商品マスタの品番レコードはすべてユニークになっていて 色やサイズで品番が複数存在するものではありません。 何回やってもレコード件数が前者のほうが多くなってしまいます。 分かる方がいらしたらぜひ教えていただきたいです。

  • ACCESS SQL ユニオンと右結合

    いつもお世話になっています。 ACCESS 初心者ですが、年間の売上データテーブルと今月の売り上げデータテーブルをクエリで結合させたあと、右結合でそれぞれの区分を表示させたいと考えています。 現在、年間の売上データテーブルに右結合でそれぞれの区分を表示させる (区分があったりなかったり、しかも区分の管理番号は末尾が随時更新されていくので、リレーションはSQLビューを使用)ところまではやってみたのですが、 今月の売り上げをどうやって結合させたらよいのかわかりません。 詳しい方に教えていただきたいと思います。 よろしくお願いいたします。 ACCESS2007~2010 SELECT [T_年間売上].ID, [T_年間売上].日付, [T_年間売上].管理番号, T_区分種類.書類名称, [T_年間売上].品番, [T_年間売上].受領欄, [T_年間売上].PDF FROM T_区分種類 RIGHT JOIN T_年間売上 ON T_区分種類.CSNo=IIf(LEN(T_年間売上.管理番号)=13,LEFT(T_年間売上.管理番号,10),LEFT(T_年間売上.管理番号,8));

  • 重複項目を取得するSQL分

    SQL分でわからないことがあるので質問させてください。 Aというテーブルに、 番号と処理通番(ユニーク)の2つカラムがあります。 Aテーブルから重複した番号とその処理通番を 上から4件まで取得したいのですが、 ----------------------------- SELECT A.番号,A.処理通番 FROM A INNER JOIN (SELECT 番号 FROM A GROUP BY 番号 HAVING COUNT(*) > 1) AS B ON (A.番号 = B.番号) ORDER BY A.番号,A.処理通番 ----------------------------- のSQLでは重複した番号のデータを 全て取得してしまいます。 番号別に4件まで取得したいのですが、 どのようなSQLを書けば取得できますか? よろしくお願いします。

  • SQLでレコードの抽出

    MySQLです。 商品IDと販売先、管理番号が、判明しているとき、 最大商品IDとそのレコードを取得するには、 どのようなSQLを書けば、よろしいでしょうか? select *, ? from SYOUHIN WHERE ???? テーブル例) ↓ユニーク 商品ID 販売先 管理番号  販売日 1   A社   1     2015-07-10 2   A社   2     2015-07-12 3   B社   1     2015-06-30 4   B社   2     2015-07-06 5   C社   1     2015-04-21

    • ベストアンサー
    • MySQL
  • 効率の良いSQL文の書き方を教えてください

    MySQLで開発をしています。 1回のSQLで、下記テーブルの内容を日付・ユーザ番号毎(日付・ユーザ番号が同じ時に同じレコード)に、 型番1個数、 型番2個数、 その他が2か3で型番2・品番1個数、 その他が2か3で型番2・品番1個数、 その他が2か3で型番2・品番1での売上小計、 その他が2か3で型番2・品番2個数での売上小計、 売上合計、 以上の各カラムを持つテーブルに再編して返したいのですが、 効率の良いやり方がわかりません。 どなたかよろしくお願いします。 テーブル ユーザ番号 日付   型番  品番   売上  その他 ----- --- --- --- --- ---  001     3/10    1    2     500    1  001     3/10    2    1      0    1  003     3/11    2    1     100    2  004     3/12    1    1     100    2  005     3/12    2    2      0     2  001     3/13    1    2     500    1  003     3/13    2    1     100    2  003     3/13    2    1      0     3  002     3/14    1    1     100    3  005     3/15    2    2     0      1

  • WHERE句で結合。INNER JOINとの違い

    MySQLで複数テーブルからデータ取得する際、 FROMの後に、テーブル名を2つ書いて、「WHERE」で繋げる書き方と、 「JOIN ★★ ON」で繋げる書き方では、何が違うのでしょうか? ・「INNER JOIN」と同じ意味でしょうか? ・書き方によっては、「LEFT OUTER JOIN」みたいにも書けるのでしょうか? ・普通は、どちらの書き方で書くとか、そういうお作法的な暗黙の了解はあるでしょうか? ・例えば「WHERE」だと3つ以上繋げられない(?)から、奨励されていない、とか…

    • ベストアンサー
    • MySQL
  • SQL文の質問 JOINとORDERの組み合わせ

    現在下記にてSQLを作成しています ■わからないこと JOINでORDER(昇順)を設定するにはどうすればよいのでしょうか? 現在ではエラーが出ます(演算子がありません) mySQL = "SELECT B.B名, B.D番号 " & _ "FROM Bフレ INNER JOIN B ON B.D番号=Bコード.コード " & _ "WHERE(((B.日付)>=#" & orderDate & "#) AND ((B.日付)<=#" & shipDate & "#)) " & _ "GROUP BY Bコード.B名, B.D番号" & _ "ORDER BY B.D番号 ASC; わかる方ご教授願います

  • 重複せずに取り出すはSQLでできますか?

    アクセス2010です。 テーブルA AB AC DB GR から データの先頭文字だけを重複せずに取り出すには? テーブルB A D G 現在 rs.MoveNextでループを使い1個ずつ同じのがあるか、ないかで取り出していますが、SQL文1行だけで可能でしょうか?

  • inner joinでサブクエリ

    SQLについてお教え頂けませんでしょうか? 在庫テーブル ・ID ・数量 データ 001,1 001,3 002,3 002,2 002,4 003,2 商品テーブル ・ID データ 001 002 003 004 やりたいこと: 在庫テーブルには重複しているIDがあります。 商品テーブルには重複しているIDはありません。 在庫テーブルの重複を削除したIDと商品テーブルのIDをinner joinで結びたいと思います。 ・select distinct ID FROM 在庫テーブル ・select ID FROM 商品テーブル この2つのjoin方法がわかりません。 結果として、 001 002 003 を取得したいいです。宜しくお願いします。 ちなみに select ID from 商品テーブル inner join 在庫テーブル 商品テーブル.ID = exists(select distinct ID from 在庫テーブル) というコードを書きましたが、動きませんでした・・・抽出データが0件でした・・・

  • SQL 重複データの抽出

    こんにちは SQLで教えてください 今 会員番号ごとの重複データがあります 例  会員番号 日付    金額 住所 その他1 その他2     1 2001/01/01  120 XXXX YYYYY  UUUUUU     1 2001/12/01  130 XXX YYYYY IIIII ⇒ 2 2001/08/12 50 pppp iiiii ooooo 3 2003/01/06 60 iiiii iiii uuuuu ⇒ 3 2002/03/18 10 22222 eeeee nnnnn 3 2001/08/19 500 ddddd rrrrr rrrrr 上記の様なデータで会員番号ごとで日付の最大のレコード(同一日なら入力順に最初)のレコードを抽出したいのですが distinctを使うと会員番号と日付のデータしか抽出されませんので その他の項目も抽出したいのですが... SQLでできなければ VB2005でもいいのですが?....   どうかよろしくお願いします。