2013-05-29 68 views
2

我的項目是關於一家珠寶店,我試圖找到最大利潤的產品。如何找到3個不同的表格之間的利潤

我有3個表,給了我的信息:

SALES表:

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

返回表:

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個寄存器,以便它們僅在必要時使用。當我嘗試連接時,很多行都是空的。我認爲必須用OUTER JOIN或其他什麼來完成,但我不知道該怎麼做。

回答

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。

+0

<3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 – user2432398

+0

@ user2432398 - np,很高興能提供幫助。順便說一句 - 我不完全確定你是否需要使用SUM - 如果你的表中只有12條記錄(即1-1關係),那麼你將不需要任何聚合。但是,如果您的銷售表可能有多個產品記錄,請使用SUM查看Gordon的答案。親切的問候。 – sgeddes

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。這很重要,因爲並非所有產品都有銷售或退貨。你不想失去這些,僅僅因爲他們不好賣(沒有銷售)或超級流行(沒有回報)。

+0

我同意這張海報,應該使用採購表中的產品ID。你可以有沒有銷售有采購.... –

+0

+1。優秀的解釋。 – William

+0

我發現這是真的很有幫助..我現在非常接近答案,但這裏是問題:我可以看到列中的所有productid,但在利潤列我只能看到3個寄存器,我有在返回表中,所有其他的都是NULL – user2432398

0

你想要做一個銷售的左外連接返回。 (你可以有沒有退貨的銷售,但是當你沒有銷售時,應該沒有退貨。)

,然後你想右外連接採購到這個comined表(由於採購不出示擔保銷售,但你不能賣你沒有的東西。)

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 

這應該沒有空