🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL Workbench

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

1274閲覧

2つのSQLを1つにまとめたい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL Workbench

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/02/05 10:46

編集2021/02/05 12:38

前提・実現したいこと

商品の発注を行っており、
予測数量(YOSOKU_SURYOU)が0以下の商品と、
現在すでに発注をかけている商品の数量(TOTAL_HATCHU_SURYOU)を比較して
追加で発注が必要なアイテムを出力したいです。

「TOTAL_HATCHU_SURYOU」は現在発注をかけている数量となりますので
マイナスケースになることはありません。

予測数量(YOSOKU_SURYOU)は、
ある一定の時期までに、在庫として残るアイテム数の予測であり、
0またはマイナスの場合は追加発注が必要なアイテムということになります。

追加発注が必要なアイテムの中でも、
現在すでに発注をかけている商品の数量(TOTAL_HATCHU_SURYOU)で
足りるかどうかを確認したいです。

発生している問題・エラーメッセージ

(1)のSQLで出力したITEM_IDと (2)のSQLで出力したITEM_IDが一致していて (2)の「YOSOKU_SURYOU」と (1)の「TOTAL_HATCHU_SURYOU」を足した時に 【0またはマイナスになる】ITEM_IDを出力したいです。 上記を1つのSQLで出力する方法が分からず、 どのように記述すれば良いかご教示いただきたいです。 例) 予測数量(YOSOKU_SURYOU)が-20で、 発注数量(TOTAL_HATCHU_SURYOU)が5の場合は、 発注数量が15個足りないので追加発注が必要 該当のITEM_IDをSELECT結果に出力したい

該当のソースコード

Mysql

1(1) 2SELECT 3 ITEM_HATCHU.ITEM_ID, 4 SUM(HATCHU_SURYOU) as TOTAL_HATCHU_SURYOU 5FROM 6 ITEM_HATCHU 7GROUP BY 8 ITEM_HATCHU.ITEM_ID; 9 10(2) 11SELECT 12 INFO.ITEM_ID 13FROM 14 ITEM_INFO 15 INNER JOIN ITEM_YOSOKU ON 16 ITEM_INFO.ITEM_ID = ITEM_YOSOKU.ITEM_ID AND 17 ITEM_YOSOKU.YOSOKU_SURYOU <= 0 18ORDER BY 19 INFO.ITEM_ID; 20 21 22 23追記【確認用 CREATE TABLE】------------ 24 25CREATE TABLE `ITEM_HATCHU` ( 26 `ITEM_ID` varchar(10) COLLATE utf8_unicode_ci NOT NULL COMMENT 'アイテムID', 27 `HATCHU_ID` varchar(10) COLLATE utf8_unicode_ci NOT NULL COMMENT '発注ID', 28 `HATCHU_SURYOU` int(8) NOT NULL COMMENT '発注数量', 29 PRIMARY KEY (`HATCHU_ID`), 30 KEY `ITEM_ID` (`ITEM_ID`) 31) 32 33CREATE TABLE `ITEM_INFO` ( 34 `ITEM_ID` varchar(10) COLLATE utf8_unicode_ci NOT NULL COMMENT 'アイテムID', 35 `ITEM_NAME` varchar(10) COLLATE utf8_unicode_ci NOT NULL COMMENT 'アイテムID', 36 PRIMARY KEY (`ITEM_ID`) 37) 38 39CREATE TABLE `ITEM_YOSOKU` ( 40 `ITEM_ID` varchar(10) COLLATE utf8_unicode_ci NOT NULL COMMENT 'アイテムID', 41 `YOSOKU_SURYOU ` int(8) NOT NULL COMMENT '予測数量', 42 PRIMARY KEY (`ITEM_ID`) 43) 44 45追記【確認用 INSERT文】------------ 46 47INSERT INTO `ITEM_YOSOKU` (`ITEM_ID`, `YOSOKU_SURYOU`) VALUES ('001','-20'); 48INSERT INTO `ITEM_YOSOKU` (`ITEM_ID`, `YOSOKU_SURYOU`) VALUES ('002','-20'); 49INSERT INTO `ITEM_YOSOKU` (`ITEM_ID`, `YOSOKU_SURYOU`) VALUES ('003','-20'); 50INSERT INTO `ITEM_YOSOKU` (`ITEM_ID`, `YOSOKU_SURYOU`) VALUES ('004','-20'); 51INSERT INTO `ITEM_YOSOKU` (`ITEM_ID`, `YOSOKU_SURYOU`) VALUES ('005','-20'); 52 53INSERT INTO `ITEM_INFO` (`ITEM_ID`, `ITEM_NAME`) VALUES ('001','アイテムA'); 54INSERT INTO `ITEM_INFO` (`ITEM_ID`, `ITEM_NAME`) VALUES ('002','アイテムB'); 55INSERT INTO `ITEM_INFO` (`ITEM_ID`, `ITEM_NAME`) VALUES ('003','アイテムC'); 56INSERT INTO `ITEM_INFO` (`ITEM_ID`, `ITEM_NAME`) VALUES ('004','アイテムD'); 57INSERT INTO `ITEM_INFO` (`ITEM_ID`, `ITEM_NAME`) VALUES ('005','アイテムE'); 58 59INSERT INTO `ITEM_HATCHU` (`ITEM_ID`, `HATCHU_ID`, `HATCHU_SURYOU` ) VALUES ('001','HA001','30'); 60INSERT INTO `ITEM_HATCHU` (`ITEM_ID`, `HATCHU_ID`, `HATCHU_SURYOU` ) VALUES ('002','HA002','30'); 61INSERT INTO `ITEM_HATCHU` (`ITEM_ID`, `HATCHU_ID`, `HATCHU_SURYOU` ) VALUES ('003','HA003','30'); 62INSERT INTO `ITEM_HATCHU` (`ITEM_ID`, `HATCHU_ID`, `HATCHU_SURYOU` ) VALUES ('004','HA004','30'); 63INSERT INTO `ITEM_HATCHU` (`ITEM_ID`, `HATCHU_ID`, `HATCHU_SURYOU` ) VALUES ('005','HA005','5'); 64 65→ITEM_ID「005」は、YOSOKU_SURYOUが「-20」に対して、HATCHU_SURYOUが「5」なので 66 追加発注が必要=SELECT結果にITEM_IDを出力したい 67

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

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

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

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

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

m.ts10806

2021/02/05 10:56

テーブル定義をCREATE TABLEで提示してください。 あとMySQLのバージョンは幾つでしょうか。
sazi

2021/02/05 11:15

>(2)の「YOSOKU_SURYOU」が >(1)の「TOTAL_HATYUU_SURYOU」よりも【少ない】 >ITEM_IDを出力したいです。 (2)では「YOSOKU_SURYOU <= 0」となっていますので、それに対する比較なら「TOTAL_HATYUU_SURYOU」がマイナスケースがあるという事ですか? 「TOTAL_HATYUU_SURYOU」にマイナスが無いなら、全てが対象になるように思うのですが。
退会済みユーザー

退会済みユーザー

2021/02/05 12:56 編集

m.ts10806様 コメントありがとうございます。 質問内容を訂正させていただきましたので よろしければご確認いただけますと幸いです。 また、バージョンは6.3になります。
退会済みユーザー

退会済みユーザー

2021/02/05 12:36

sazi様 コメントありがとうございます。 説明が足らず、申し訳ございません。 「TOTAL_HATCHU_SURYOU」は現在発注をかけている数量となりますので マイナスケースになることはありません。 予測数量(YOSOKU_SURYOU)は、 ある一定の時期までに、在庫として残るアイテム数の予測であり、 0またはマイナスの場合は追加発注が必要なアイテムということになります。 追加発注が必要なアイテムの中でも、 現在すでに発注をかけている商品の数量(TOTAL_HATCHU_SURYOU)で 足りるかどうかを確認したいので (2)の「YOSOKU_SURYOU」と (1)の「TOTAL_HATCHU_SURYOU」を足した時に 【0またはマイナスになる】ITEM_IDを出力したいです。 ※質問も訂正させていただきました。 例) 予測数量(YOSOKU_SURYOU)が-20で、 発注数量(TOTAL_HATCHU_SURYOU)が5の場合は、 発注数量が15個足りないので追加発注が必要 該当のITEM_IDをSELECT結果に出力したい
退会済みユーザー

退会済みユーザー

2021/02/05 12:56

Orlofsky様 コメントありがとうございます。 質問内容を訂正させていただきましたので よろしければご確認いただけますと幸いです。
guest

回答2

0

ベストアンサー

(1)のSQLで出力したITEM_IDと
(2)のSQLで出力したITEM_IDが一致していて
(2)の「YOSOKU_SURYOU」と
(1)の「TOTAL_HATCHU_SURYOU」を足した時に
【0またはマイナスになる】ITEM_IDを出力したいです。

このような仕様であればおおよそ以下のようなクエリで実現できるかと思います。

SQL

1SELECT 2 A.ITEM_ID, 3 A.TOTAL_HATCHU_SURYOU, 4 B.YOSOKU_SURYOU, 5 C.ITEM_NAME 6FROM ( 7 SELECT 8 ITEM_ID, 9 SUM(HATCHU_SURYOU) AS TOTAL_HATCHU_SURYOU 10 FROM ITEM_HATCHU 11 GROUP BY ITEM_ID 12) AS A 13JOIN ITEM_YOSOKU AS B ON A.ITEM_ID = B.ITEM_ID 14JOIN ITEM_INFO AS C ON A.ITEM_ID = C.ITEM_ID 15WHERE A.TOTAL_HATCHU_SURYOU + B.YOSOKU_SURYOU <= 0 16

投稿2021/02/05 13:32

neko_the_shadow

総合スコア2349

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

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

退会済みユーザー

退会済みユーザー

2021/02/07 05:05

neko_the_shadow様 希望する結果を出力することができました! 丁寧にご教示いただきありがとうございました。 引き続き勉強してまいります。
guest

0

HATCHU_SURYOU > 0の前提なら、集計しなくとも

SQL

1SELECT distinct ITEM_ID 2FROM ITEM_HATCHU 3where ITEM_ID in ( 4 SELECT INFO.ITEM_ID 5 FROM ITEM_INFO 6 INNER JOIN ITEM_YOSOKU 7 ON ITEM_INFO.ITEM_ID = ITEM_YOSOKU.ITEM_ID 8 AND ITEM_YOSOKU.YOSOKU_SURYOU <= 0 9 )

とか、

SQL

1SELECT INFO.ITEM_ID 2FROM ITEM_INFO 3 INNER JOIN ITEM_YOSOKU 4 ON ITEM_INFO.ITEM_ID = ITEM_YOSOKU.ITEM_ID 5 AND ITEM_YOSOKU.YOSOKU_SURYOU <= 0 6where exists( 7 select 1 from FROM ITEM_HATCHU 8 where ITEM_ID=ITEM_INFO.ITEM_ID 9 )

とかで良いのではないでしょうか。
※後者の方がコストは低いと思われます。

(1)の「TOTAL_HATCHU_SURYOU」を足した時に
【0またはマイナスになる】ITEM_IDを出力したいです。

この条件を見落としていました。

SQL

1SELECT INFO.ITEM_ID 2FROM ITEM_INFO 3 INNER JOIN ITEM_YOSOKU 4 ON ITEM_INFO.ITEM_ID = ITEM_YOSOKU.ITEM_ID 5 AND ITEM_YOSOKU.YOSOKU_SURYOU <= 0 6where exists( 7 select 1 from FROM ITEM_HATCHU 8 where ITEM_ID=ITEM_YOSOKU.ITEM_ID 9 group by ITEM_ID 10 having sum(HATCHU_SURYOU) <= ITEM_YOSOKU.YOSOKU_SURYOU 11 )

※検証していないので、エラーになったらごめんなさい。

投稿2021/02/05 13:02

編集2021/02/05 15:16
sazi

総合スコア25327

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

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

退会済みユーザー

退会済みユーザー

2021/02/07 05:09

sazi様 EXISTS句は初見でしたが、このように使用するのですね。 迅速且つ丁寧にご教示いただき誠にありがとうございました。 質問方法についても、今後参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問