我的项目是关于一家珠宝店,我试图找到最大利润的产品。
我有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
或其他东西来做,但我不知道该怎么做。
答案 0 :(得分:2)
你似乎对SQL很新。在给表别名时,尝试使用表缩写。它使查询更容易阅读(例如,p
procurement
和s
销售)。
此外,您需要学习正确的连接语法。但是,这不会对您有所帮助,因为您需要在进行连接之前进行预聚合。也就是说,分别获取成本,销售额和退货金额,然后将它们组合在一起:
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
这也使用COALESCE
将NULL
值更改为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
这应该没有空值