2015-01-21 4 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

+0

О да, это может произойти, если номер детали никогда не продавался в каком-либо месте. '[INNER] JOIN' отфильтровывает такие местоположения.Замените «LEFT JOIN» и дайте мне знать, как это выглядит сейчас. – RandomSeed

+0

Теперь отображаются местоположения. только расчет неверен, если у вас есть место в таблице квитанций и в том же месте в таблице продаж, нет ничего плохого. Но если у вас есть место в таблице квитанций, которое не отражается в таблице продаж, вы получаете выходной NULL. – da1lbi3

0

Союз может 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. Результат:

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

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