質問: '2017/03/06' ) AS t2 ) ; ``` ### 試したこと MySQLのデーブル同士の比較や、IN句でのサブクエリなどの情報をミックスして、上のようなSQLを組んだところ、MSM-04を得られましたので、新しく増えたアッガイを検出することは出来ると思います。 また、これを逆転させれば、3/8にザクが無い事も検出は可能と思います。 しかし、その他の同じIDの価格や名前の違いを検出する方法を見つけ出せずにおります。 一度のSQLで検出できなくても大丈夫ですので、このようなデータから、日付毎の項目内容の違いを抽出するSQLがありましたら、ご教授ください。 なお、記載はいたしませんでしたが、ganpuraテーブルにはオートインクリメントのPrimarykeyのフィールドはあります。
回答: stokを元に入出庫を想像することは不可能です。 3/7のアッガイは3個入荷したのか、5個入荷して2個売れたのかわかりません。 この手の在庫管理は月初在庫を確定しておき、そこから入出庫データを たしたり引いたりして特定日のstokを計算してください 追記 === ``` create table ganpura(id varchar(20),name varchar(20),price int,stock int,d date,unique(id,d)); insert into ganpura values ('MS-06','ザク',2000,3,'2017-03-06'), ('MS-09','ドム',2500,3,'2017-03-06'), ('MSM-07','ズゴック',1700,3,'2017-03-06'), ('MS-06','ザク',2000,0,'2017-03-07'), ('MS-09','ドム',2500,3,'2017-03-07'), ('MSM-07','ズゴック',1700,3,'2017-03-07'), ('MSM-04','アッガイ',2000,3,'2017-03-07'), ('MS-09','ドム',2000,3,'2017-03-08'), ('MSM-07','ズゴック',1700,3,'2017-03-08'), ('MSM-04','ガンダム',2000,3,'2017-03-08'); ``` ※条件:日付が連続していること それが担保されないなら、前日の日付を探す処理が必要 3/6→3/7への変化 ``` select id,name ,-sum(stock*(d=(@d:='2017-03-07')- interval 1 day))+sum(stock*(d=@d)) as diff_stock ,-sum(price*(d=@d- interval 1 day))+sum(price*(d=@d)) as diff_price ,case when sum(d=(@d-interval 1 day))=0 then '追加' when sum(d=@d)=0 then '削除' else '' end as status from ganpura where d between @d- interval 1 day and @d group by id having diff_stock<>0 or diff_price<>0; ``` | id | name | diff_stock | diff_price | status | | --- | --- | --- | --- | --- | | MS-06 | ザク | -3 | 0 | | | MSM-04 | アッガイ | 3 | 2000 | 追加 | @d:='2017-03-07'の箇所を'2017-03-08'変更すれば | id | name | diff_stock | diff_price | status | | --- | --- | --- | --- | --- | | MS-06 | ザク | 0 | -2000 | 削除 | | MS-09 | ドム | 0 | -500 | | 調整しました。