2015-01-21 79 views
4

总和我有两个表:计算不同表

收到

Partnumber | Receipt | Location 

而一个销售表:

Partnumber | Sales | Location 

什么即时试图做的是计算每个位置和每个零件编号的库存数量。我有查询到一个表做到这一点:

在这里,我每部分号码

SELECT Location, sum(Receipt) FROM receipt WHERE Partnumber = 100 GROUP BY Location 

你需要做同样的销售表计算在该位置的收容部。最后,我想从每个位置的收据表中计算总和 - 每个位置销售额的总和。

数据:

Partnumber | Receipt | Location 

100   2   500 
100   5   500 
100   2   300 
200   4   600 
300   8   500 


Partnumber | Sales | Location 

100   1   500 
300   4   500 
100   1   300 

这里是输出:

Partnumber | stock | location 
100   6  500 
100   1  300 
200   4  600 
300   4  500 

根据每个位置编号减去每个位置编号计数的销售。因此,计算收据的文章。这是可能的一个查询?

回答

3

你已经知道如何计算接收部分的总人数:

SELECT Location, SUM(Receipt) 
FROM receipt WHERE Partnumber = 100 GROUP BY Location ; 

计算出售部分的总数量是相似的:

SELECT Location, SUM(Sales) 
FROM sales WHERE Partnumber = 100 GROUP BY Location ; 

现在,所有你需要的是计算差值,并且所需要的是结合以上两个查询:

SELECT Location, (receipt_count - COALESCE(sales_count, 0)) AS current_stock 
FROM (
    SELECT Location, SUM(Receipt) AS receipt_count 
    FROM receipt WHERE Partnumber = 100 GROUP BY Location 
) AS Receipt 
LEFT JOIN 
(
    SELECT Location, SUM(Sales) AS sales_count 
    FROM sales WHERE Partnumber = 100 GROUP BY Location 
) AS Sales USING (Location) 
+0

它的工作原理!但查询输出一行..我该如何解决这个问题?因为Partnumber可以有多个位置。我编辑了我的输出。 – da1lbi3 2015-01-21 12:30:37

+0

哦,是的,如果零件号码从未在某个位置出售过,则会发生这种情况。 '[INNER] JOIN'会过滤掉这些位置。用'LEFT JOIN'替换并让我知道它现在的样子。 – RandomSeed 2015-01-21 12:33:30

+0

它现在显示的位置。只有计算不正确,如果您在收据表中有一个位置并且在销售表中有相同的位置,则没有任何问题。但是,如果您在收据表中有一个销售表中不存在的位置,那么您将获得输出NULL。 – da1lbi3 2015-01-21 12:41:13

0

Union can b Ë得心应手这个问题:

(SELECT Partnumber, Receipt as quantity, Location FROM receipt) 
UNION 
(SELECT Partnumber, (-Sales) as quantity, Location FROM sales) 

这将返回

PARTNUMBER | QUANTITY | LOCATION 
    100 |  2 | 500 
    100 |  5 | 500 
    200 |  4 | 600 
    300 |  8 | 500 
    100 |  -1 | 500 
    300 |  -4 | 500 

请注意,我是如何把负值从销售表的数量。

现在有了这个,你可以做你需要的东西:

SELECT DISTINCT Partnumber, sum(quantity) as Stock, Location FROM 
(
    (SELECT Partnumber, Receipt as quantity, Location FROM receipt) 
    UNION 
    (SELECT Partnumber, (-Sales) as quantity, Location FROM sales) 
) as UnitedTable 
GROUP BY Partnumber, Location; 

不要因地点和部分号码忘了组。 结果:

PARTNUMBER | STOCK | LOCATION 
     100 | 6 | 500 
     200 | 4 | 600 
     300 | 4 | 500 

http://sqlfiddle.com/#!2/76193d/19