2017-05-14 1 views
-2

私は、顧客の注文時に自動的に商品の数量を加算または減算できるデータベースを作成しようとしています。これは、任意の順序なしで出力され値を複製せずに別の列を追加したり減算したりする

select p.productid, p.productname,p.price, 
p.quantity + (ifnull(sum(s.quantity),0) - ifnull(sum(o.quantity),0))as 
quantity 
from product p 
left join wholesale.supply s on p.productname = s.productname 
left join wholesale.order o on p.productname = o.productname 
group by p.productname order by quantity 

:これは私のコードです

productid  productname  price  quantity  
    6   Sony X   19700  6 
    4  Samsung Galaxy S8  38000  11 
    5   LG G6   31500  12 

そして、これは私のサプライヤーページ

id  productname  quantity 
    1  Sony X   10 
    2  Sony X   10 
    3  Sony X   10 
    4  Sony X   10 

で出力され、これは、注文ページであります

id  productname  quantity 
1  Sony X   10 
2  Sony X   5 

出力が今i Sこれは:youllのは数学を行う場合

productid  productname  price  quantity  
    6   Sony X   19700  26 
    4  Samsung Galaxy S8  38000  11 
    5   LG G6   31500  12 

ソニーXは次のようになります。

productid  productname  price  quantity  
    6   Sony X   19700  31 
    4  Samsung Galaxy S8  38000  11 
    5   LG G6   31500  12 

私の質問量の値は単なる例のように信頼性がないからである、 は私が持っているソニーのX 6PCS私の株に 合計40個を注文します。 と顧客注文合計15個 6 + 40 = 46-15 = 31 から31になりますが、データベースには26が表示されます。

+0

ごめんなさいしかし、質問は何ですか? –

+0

あなたはすべての行を表示するwntですか? –

+0

私の質問を理解していただければ幸いです。ありがとう –

答えて

0

あなたの質問を破棄すれば、何が起きているのかを見ることができます。

drop table if exists p; 

create table p (productid int, productname varchar(20),  price int, quantity int); 
insert into p values  
( 6 ,   'Sony X'   , 19700 ,  6), 
( 4 ,  'Samsung Galaxy S8' , 38000 ,  11), 
( 5 ,   'LG G6'   , 31500 ,  12); 

drop table if exists s; 
create table s (id int, productname varchar(20),  quantity int); 
insert into s values 
( 1 ,  'Sony X' ,  10), 
( 2 ,  'Sony X' ,  10), 
( 3 ,  'Sony X' ,  10), 
( 4 ,  'Sony X' ,  10); 

drop table if exists o; 
create table o(id int, productname varchar(20),  quantity int); 
insert into o values 
(1 ,  'Sony X' ,  10), 
(2 ,  'Sony X' ,  5); 

MariaDB [sandbox]> select p.productid, p.productname,p.price, 
    -> p.quantity 
    -> ,ifnull(sum(s.quantity),0) squantity 
    -> ,ifnull(sum(o.quantity),0) oquantity 
    -> from p 
    -> left join s on p.productname = s.productname 
    -> left join o on p.productname = o.productname 
    -> group by p.productname 
    -> order by quantity 
    -> ; 
+-----------+-------------------+-------+----------+-----------+-----------+ 
| productid | productname  | price | quantity | squantity | oquantity | 
+-----------+-------------------+-------+----------+-----------+-----------+ 
|   6 | Sony X   | 19700 |  6 |  80 |  60 | 
|   4 | Samsung Galaxy S8 | 38000 |  11 |   0 |   0 | 
|   5 | LG G6    | 31500 |  12 |   0 |   0 | 
+-----------+-------------------+-------+----------+-----------+-----------+ 
3 rows in set (0.00 sec) 

あなたは試みることができるこの

MariaDB [sandbox]> select p.productid,p.productname,p.price,p.quantity, s.*,o.*,p.quantity + ifnull(squantity,0) - ifnull(oquantity,0) qty 
    -> from p 
    -> left join 
    -> (select s.productname sproductname, sum(s.quantity) squantity from s group by s.productname) s on sproductname = p.productname 
    -> left join 
    -> (select o.productname oproductname, sum(o.quantity) oquantity from o group by o.productname) o on oproductname = p.productname; 
+-----------+-------------------+-------+----------+--------------+-----------+--------------+-----------+------+ 
| productid | productname  | price | quantity | sproductname | squantity | oproductname | oquantity | qty | 
+-----------+-------------------+-------+----------+--------------+-----------+--------------+-----------+------+ 
|   6 | Sony X   | 19700 |  6 | Sony X  |  40 | Sony X  |  15 | 31 | 
|   4 | Samsung Galaxy S8 | 38000 |  11 | NULL   |  NULL | NULL   |  NULL | 11 | 
|   5 | LG G6    | 31500 |  12 | NULL   |  NULL | NULL   |  NULL | 12 | 
+-----------+-------------------+-------+----------+--------------+-----------+--------------+-----------+------+ 
3 rows in set (0.00 sec) 
+0

よかったです。 –

+0

私はちょうど質問があります。 squantity60とoquantity80はどこから来たのですか? –

+0

ジョインを個別に見ると、最初のジョインから4行、2回目から2行が返されます。タンデムでは8行が得られます。 8×10 = 80、(4×10)+(4×5)= 60となる。 –

関連する問題