如何在3个不同的表之间找到利润

时间:2013-05-29 13:27:22

标签: mysql sql max mysql-workbench

我的项目是关于一家珠宝店,我试图找到最大利润的产品。

我有3张表给我提供信息:

SALES表:

salesid  productid   Quantity Price
11001    13001       4        5
11002    13002       6        10
11003    13003       5        16
.
.
11012    13012       7        15

RETURN表:

salesid  productid   Quantity Price
11003    13003       1        16
11007    13007       3        12
11008    13008       3        8

采购表:

procurementid  productid   Quantity Price
100001         13001       10       2
100002         13002       10       2
.
. 
100012         13012       10       2

利润来自这个公式:

  

利润=数量*价格(销售) - 数量*价格(退货) - 数量*价格(采购)

现在问题就在于此。到目前为止,我达到了这个目标

select a.productid,(a.quantity*a.price-b.quantity*b.price-c.quantity*c.price) as Profit
from sales as a ,return as b ,procurement as c
where a.productid = c.productid 
GROUP BY productid

在这种情况下,我得不到正确答案。

这是因为在返回表中我只有3个寄存器,但在其他表中我有12个,所以当它计算利润时,它会为其他表的每一行使用整个返回表。

我尝试使用max(Profit),但它没有做任何事情。

我实际上不知道如何连接返回表的3个寄存器,以便它们仅在必须时使用。当我尝试连接时,很多行都是null。我认为必须用OUTER JOIN或其他东西来做,但我不知道该怎么做。

3 个答案:

答案 0 :(得分:2)

你似乎对SQL很新。在给表别名时,尝试使用表缩写。它使查询更容易阅读(例如,p procurements销售)。

此外,您需要学习正确的连接语法。但是,这不会对您有所帮助,因为您需要在进行连接之前进行预聚合。也就是说,分别获取成本,销售额和退货金额,然后将它们组合在一起:

select p.productid,
       (coalesce(s.rev, 0) - coalesce(r.ret, 0) - coalesce(p.cost, 0)) as profit
from (select p.productid, SUM(quantity*price) as cost
      from procurement p
      group by p.productid
     ) p left outer join
     (select s.productid, sum(quantity*price) as rev
      from sales s
      group by s.productid
     ) s 
     on p.productid = s.productid
     (select r.productid, sum(quantity*price) as ret
      from return
      group by s.productid
     ) r
     on p.productid = r.productid;

此查询还使用left outer join。这很重要,因为并非所有产品都有销售或退货。你不想失去这些,只因为他们是糟糕的卖家(没有销售)或极其受欢迎(没有回报)。

答案 1 :(得分:0)

您的返回表上似乎需要使用LEFT JOIN,因为它只有3个产品而其他表都有12个。

select a.productid,
    (a.quantity*a.price-coalesce(b.quantity,0)*coalesce(b.price,0)-c.quantity*c.price) as Profit
from sales a 
    join procurement c on a.productid = c.productid 
    left join return b on a.salesid = b.salesid
group by a.productid

这也使用COALESCENULL值更改为0.

答案 2 :(得分:0)

您希望将销售的左外连接执行返回。 (您可以在没有退货的情况下进行销售,但如果没有销售则不应该退货。)

然后你想对外连接采购到这个合并的表(因为采购不保证销售,但你不能卖你没有的东西。)

select c.productid, 
(a.quantity*a.price-b.quantity*b.price-c.quantity*c.price) as Profit
from (sales as a LEFT JOIN return as b ON a.productid = b.productid) 
RIGHT JOIN procurement as c ON a.productid = c.productid
where a.productid = c.productid 
GROUP BY productid

这应该没有空值