MYSQLで結合の仕方教えてください

このQ&Aのポイント
  • MYSQLで複数のテーブルを結合する方法について教えてください。db_test.sales、db_test.prodct、db_test.dailyreportという3つのテーブルがあります。
  • 以下のSQL文は、2つのテーブルからデータを取得していますが、更に日報データから作業時間を製品番号毎に集計したデータを追加したいです。
  • 正しい結合方法や集計方法を教えてください。
回答を見る
  • ベストアンサー

MYSQLで結合の仕方教えてください

db_test.sales db_test.prodct db_test.dailyreport という3つのテーブルがあります 以下のようなSQL文に集計したデータも結合したいのですが Join結合の使い方が分かりません SELECT PD.productid as '製品番号', SR.cono as '客先側注文番号', str_to_date(SR.tehaiday,'%Y%m%d') as '手配日', str_to_date(SR.noukiday,'%Y%m%d') as '納入予定日', PD.hinmei as '製品名称', PD.daisu as '台数', PD.costsales as '原価', FROM db_test.sales SR, db_test.prodct PD, WHERE SR.productid = PD.productid AND SR.noukiday Like '201609%' ORDER BY PD.noukiday という2テーブルから引っ張ってきているMYSQL文があります。 先月の納期ぶんを抽出した生産の一覧です。 そこのテーブル右端に更に追加しまして 日報データから個々の作業に掛かった時間を製品番号毎に 集計したものを追加したいです。select文の末尾に (SELECT DR.productid as '製品番号', total(DR.worktime) AS '作業時間' FROM db_test.dailyreport DR GROUP BY DR.productid) を入れたいです。 FROM句に db_test.prodct inner join db_test.dailyreport on PD.productid = DR.productid と追加書いてみたのですがこれでは駄目でしょうか。 正しくはどう書けばよいのでしょうか?

  • MySQL
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • oboroxx
  • ベストアンサー率40% (317/792)
回答No.1

SELECT PD.productid as '製品番号', SR.cono as '客先側注文番号', str_to_date(SR.tehaiday,'%Y%m%d') as '手配日', str_to_date(SR.noukiday,'%Y%m%d') as '納入予定日', PD.hinmei as '製品名称', PD.daisu as '台数', PD.costsales as '原価', WT.worktime as '作業時間' FROM db_test.sales SR, db_test.prodct PD, (SELECT DR.productid as productid, total(DR.worktime) AS worktime FROM db_test.dailyreport DR GROUP BY DR.productid) WT WHERE SR.productid = PD.productid AND SR.productid = WT.productid AND SR.noukiday Like '201609%' ORDER BY PD.noukiday で、うまくいかないかな。

その他の回答 (1)

  • kreikg
  • ベストアンサー率39% (21/53)
回答No.2

色々と前提を確認したいのですが。 まず上の SELECT PD.productid as '製品番号', SR.cono as '客先側注文番号', str_to_date(SR.tehaiday,'%Y%m%d') as '手配日', str_to_date(SR.noukiday,'%Y%m%d') as '納入予定日', PD.hinmei as '製品名称', PD.daisu as '台数', PD.costsales as '原価', FROM db_test.sales SR, db_test.prodct PD, WHERE SR.productid = PD.productid AND SR.noukiday Like '201609%' ORDER BY PD.noukiday のSQL文は正常に動作していますか? 仮に両方のテーブルに製品番号があるとしてもdb_test.salesのデータの横にdb_test.prodct がくっつくだけでデータの整合性がとれていない状態になっていませんか? まずそこだけ直すなら SELECT PD.productid as '製品番号', SR.cono as '客先側注文番号', str_to_date(SR.tehaiday,'%Y%m%d') as '手配日', str_to_date(SR.noukiday,'%Y%m%d') as '納入予定日', PD.hinmei as '製品名称', PD.daisu as '台数', PD.costsales as '原価', FROM db_test.sales SR INNER JOIN db_test.prodct AS PD ON SR.productid = PD.productid WHERE SR.noukiday Like '201609%' ORDER BY PD.noukiday それから、個々の作業にかかった時間を集計するなら質問者さんのクエリだと製品番号ごとにグルーピングして合計を出していますが別の日の同じ製品の作業時間まで含まれた合計時間のテーブルになってしまいそうですが問題ないのですか?

関連するQ&A

  • mySQLの内部結合について

    現在mySQLを使って、SQL文の勉強をしているのですがわからないことがあり、質問させていただきました。 テーブル同士をINNER JOINして結果を取得して、これに対してさらに別の処理(Whereなど)を行いたいのですが、うまくやり方がわかりません。 具体的にSQL文でいうとこんな感じです(ただしエラーが出て動きません)。 SELECT cmaster.comic_id,tags,title FROM mysql.comic_tag as ctag INNER JOIN mysql.comicmaster as cmaster ON ctag.comic_id = cmaster.comic_id AND WHERE tags = 'aa' この処理でやりたいことを説明するとcomic_tagとcomicmasterを結合して、その結果に対してさらにWhereでデータを絞るということしています。 このような場合はどのように処理をしたらいいんでしょうか?またjoinした後のデータを、既存のテーブルのように扱いたいのですが、なにか方法はないのでしょうか?

    • ベストアンサー
    • MySQL
  • 異なるデータベース間のテーブル結合

    DB名:db1 TABLE名:得意先マスタ DB名:db2 TABLE名:ユーザマスタ 以上のように、異なるデータベースに存在する2つのテーブルをLEFT JOINさせたいです。 結合条件は ユーザマスタ.得意先コード = 得意先マスタ.得意先コード とします。 この場合の結合方法を教えてください。 以下のようなSQL文を書いても駄目でした。 SELECT * FROM db1.ADMINISTRATOR.得意先マスタ AS  得意先マスタ   LEFT OUTER JOIN db2.ADMINISTRATOR.ユーザマスタ AS ユーザマスタ ON ユーザマスタ.得意先コード = 得意先マスタ.得意先コード よろしくお願いいたします。

  • select文の結果から新しいテーブル作成の方法

    SQLは初心者で現在勉強をしています。 (SQLServer2000を使用) select文の結果から新しいテーブル作成したいのですが、下記SQLで上手くいきません。 どなたかアドバイス宜しくお願いします。 create table 新テーブル as select OrderID, Prd.ProductID, ProductName, Prd.UnitPrice from "Order Details" Ord inner join Products Prd on Ord.ProductID = Prd.ProductID (エラー内容) キーワード 'as' 付近に正しくない構文があります。 SQLserverでは 『create table 新テーブル as』の構文は使用できないのでしょうか?

  • Accessの内部結合

    こんにちは。 Accessでcateテーブルとgoodsテーブルがあります。 select * from goods inner join cate on goods.cateid = cate.id; クエリデザインで、テーブルとテーブルを結合して上記のようなSQLができました。 これは動作することを確認しました。 SQLビューで下記のようなSQLを書きました。 select * from goods inner join cate on left(goods.cateid,5) = cate.id; しかしながら、動きませんでした。 VBAを使わずに、Accessの標準のクエリデザインから上記のようなSQLを実行させることは可能でしょうか? クエリデザインでselect left(cateid,5) as cateid from goodsというTESTクエリをつくり、TESTクエリとcateテーブルとジョインさせれば解決しそうなことはわかるのですが・・・ 宜しくお願いします。

  • PHP+MySQL 内部結合(INNER_JOIN)がうまく行きません。

    以下の文で「client_master」テーブルと「jobmaster0717」テーブルを内部結合させようとしているのですが、うまく行きません。どこがおかしいのでしょうか? <?php  // データベースサーバへの接続・データベースの選択  $db = mysql_connect('localhost','test','password');  $db_name = 'test';  mysql_select_db($db_name,$db);  // 処理対象テーブル  $tbl_name1 = "client_master";  $tbl_name2 = "jobmaster0717";    // 内部結合(INNER JOIN句)  $str_sql1 = "SELECT * FROM {$tbl_name1}"       . " INNER JOIN {$tbl_name2}"       . " ON {$tbl_name1}.company_ID"       . "  = {$tbl_name2}.client_ID;";  $rs1 = mysql_query($str_sql1,$db);  print "\"{$str_sql1}\"<br>\n";  // 結果セットの表示  show_rs($rs1,$db);  print "<br>\n";  // 結果セット(結果ID)の開放  mysql_free_result($rs1);    // データベースサーバの切断  mysql_close($db); ?>

  • グループ後に結合させたいのですが・・

    以下の様なデータがあります。       氏名  科目 得点 1行目  Aさん  国語 100 2行目  Bさん  国語 90 3行目  Aさん  英語 80 これを以下の様な表にしようと思い、 氏名 国語 英語 Aさん 100 80 Bさん 90 - 以下のSQL分を書きましたが、Aさんの得点が2倍になってしまいます。 SELECT SL.氏名 ,SUM(KT.得点) AS '国語' ,SUM(ET.得点) AS '英語' FROM [test_db].[dbo].[得点データ] SL LEFT OUTER JOIN ( SELECT * FROM [test_db].[dbo].[得点データ] WHERE 科目='国語' ) KT ON ( KT.氏名 = SL.氏名 ) LEFT OUTER JOIN ( SELECT * FROM [test_db].[dbo].[得点データ] WHERE 科目='英語' ) ET ON ( ET.氏名 = SL.氏名 ) GROUP BY SL.氏名 原因として、グループ化が結合の後にしているのだと考えています。 どの様に修正したら、いいでしょうか?

  • MySQLテーブルの結合

    MySQLテーブルの結合 select フィール名(field1,field2,field3)from xテーブル名 [inner/left/right] join yテーブル名 on 結合条件 解説書には説明されています 現在自分のデータベースは ahogedb(テーブル名) no hoge1 hoge2 bhogedb(テーブル名) no ahogeno(ahogedbのnoを登録) hoge3 ahogedbを表示してbhogedbでの訪問回数を表示させたいのです bhogedbのahogenoにはahogedbのnoが逐次登録されています 表示はno,hoge1,hoge2に追加したahogenoのカウント数 select文の式の書き方を出来れば1列にして教えてください ahogenoは別名の変数処理するのでしょうか

    • ベストアンサー
    • MySQL
  • 結合が上手くいきません

    以下のテーブルがあるとします table1 名前|住所コード|勤務地コード table2 コード|名称 テーブル1の検索結果にテーブル2の名称を引っ張ってきて取得したいのですがどうやるのでしょうか? SELECT * from table1 INNER JOIN table1.住所コード ON table2.コード INNER JOIN table1.勤務地コード ON table2.コード これではうまくいきませんでした。 SELECT (select 名称 from table2 where table2.コード=table1.住所コード),(select 名称 from table2 where table2.コード=table1.勤務地コード) FROM table1 これは上手くいくのですが重いらしいので、、、

    • ベストアンサー
    • MySQL
  • Access 2000 サブクエリとJOIN

    Access2000でSQLを発行したのですが、 エラーが出てしまいます。 テーブル(仮にtest1、test2)があるとして test1 ------------------------- 主キー | 番号|項目    1|  1|りんご    2|  2|ぶどう    3|  3|みかん    4|  4|いちご test2 ----------------------------- 一つ目|二つ目| 1| 2| 4| 1| ・・・略 test2には2つのフィールドがあり、1,2,3,4を既定値として 入れるようにしています。 やりたいとこは、test2をグループ化し「一つ目」と「二つ目」 の規定値の個数(1、2、3、4)それぞれのカウントを求めたいのです。 一つのフィールドの場合は、 select * from test1 join test2 test1.番号=test2.一つ目 group by test1.番号 で求められたのですが、二つのフィールドをグループ化した際、 一つ目のフィールドと同じ個数が二つ目のフィールドにコピーされてしまうのです。 ですので、FROM句でサブクエリを結合しその中で、 group化したものを、いくつかのサブクエリと結合し てみたのですが、うまくいきませんでした。 select cnt1.一つ目,cnt2.二つ目 from (select * from test1 left join test2 on test1.番号=test2.一つ目group by test1.番号) as cnt1 left join (select * from test1 left join test2 on test1.番号=test2.二つ目group by test1.番号) as cnt2 on cnt1.番号=cnt2.番号 といった形で作ってみました。 エイリアスをつけてしまった時点でエラーが出ているので、 どうにもしようがありません。 申し訳ないのですが、ご教授のほどよろしくお願いいたします。

  • テーブルの結合について質問です。

    テーブルの結合について質問です。 テーブル名:SHOSAI SELECT T1.TIMESTAMP AS 登録, T1.UPDATE AS 更新, T2.CONTENT AS コード, . . . FROM SHOSAI T1 LEFT OUTER JOIN X_CODE T2 ON T1.Y_CODE = T2.CODE テーブル名:SHOSAI SELECT T1.TIMESTAMP AS 登録, T1.UPDATE AS 更新, T2.CONTENT AS コード, T1.BANGO AS 番号, T3.CONTENT AS 曜日, . . . FROM JOHO T1 LEFT OUTER JOIN X_CODE T2 ON T1.Y_CODE = T2.CODE LEFT OUTER JOIN H_CODE T3 ON T1.J_CODE = T3.CODE . . . この2つのテーブルを結合したいのですが それぞれのデータ数が300あり SELECT*で呼びだしてもCSEはエラーとなってしまいます。 項目名を選定してプログラムを組んでもうまくできません。 良い方法があれば教えてください。

    • ベストアンサー
    • MySQL