回答編集履歴

2 調整

yambejp

yambejp score 45792

2017/03/07 22:17  投稿

stokを元に入出庫を想像することは不可能です。
3/7のアッガイは3個入荷したのか、5個入荷して2個売れたのかわかりません。
この手の在庫管理は月初在庫を確定しておき、そこから入出庫データを
たしたり引いたりして特定日のstokを計算してください
# 追記
```SQL
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への変化
```SQL
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|
|:--|:--|--:|--:|
|MS-06|ザク|-3|0|
|MSM-04|アッガイ|3|2000|
|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|
|:--|:--|--:|--:|
|MS-06|ザク|0|-2000|
|MS-09|ドム|0|-500|
※ただしこれだとザクは削除されたけど価格が下がったように表示される
|id|name|diff_stock|diff_price|status|
|:--|:--|--:|--:|:--|
|MS-06|ザク|0|-2000|削除|
|MS-09|ドム|0|-500||
どういった結果を得たいのか提示してもらえれば削除なのか価格変更なのか
きりわけも可能
調整しました。
1 追記

yambejp

yambejp score 45792

2017/03/07 19:14  投稿

stokを元に入出庫を想像することは不可能です。
3/7のアッガイは3個入荷したのか、5個入荷して2個売れたのかわかりません。
この手の在庫管理は月初在庫を確定しておき、そこから入出庫データを
たしたり引いたりして特定日のstokを計算してください
たしたり引いたりして特定日のstokを計算してください
# 追記
```SQL
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への変化
```SQL
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
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|
|:--|:--|--:|--:|
|MS-06|ザク|-3|0|
|MSM-04|アッガイ|3|2000|
@d:='2017-03-07'の箇所を'2017-03-08'変更すれば
|id|name|diff_stock|diff_price|
|:--|:--|--:|--:|
|MS-06|ザク|0|-2000|
|MS-09|ドム|0|-500|
※ただしこれだとザクは削除されたけど価格が下がったように表示される
どういった結果を得たいのか提示してもらえれば削除なのか価格変更なのか
きりわけも可能

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る