2016-10-28 2 views
0

У меня есть две простые таблицы. tbl_purchased и tbl_soldКак принять разницу между суммой значений столбцов?

tbl_purchased

col_item_name col_no_of_items 
Fan       5 
Builb      5 
Oven      5 
Fan       2 
Builb      2 

tbl_sold

col_item_name col_no_of_items 
Fan       3 
Oven      1 

Мне нужно принять

  1. SUM купленных товаров, GROUP BY имя элемента.
  2. SUM проданных товаров, GROUP BY item name.

Я могу сделать это, используя следующие запросы отдельно.

SELECT col_item_name, SUM(col_no_of_items) 
FROM tbl_purchased 
GROUP BY col_item_name; 

и

SELECT col_item_name, SUM(col_no_of_items) 
FROM tbl_sold 
GROUP BY col_item_name; 

теперь мне нужно взять текущий запас.

enter image description here

Это означает, что (сумма приобретенных товаров - сумма проданных предметов) GROUP BY имя элемента.

Могу ли я сделать это, используя запрос SINGLE sql?

+0

Вам действительно нужны ключи на ваших столах. Что произойдет, если вы захотите купить еще 2 фанатов? – apokryfos

+1

Это выглядит подозрительно, как домашнее задание. Вы можете сделать это в одном запросе; читать сведения о соединениях и агрегатных функциях. – Walf

+0

Я подозреваю, что практика префикса таблиц с «tbl» и столбцами с «col» очень утомительна очень быстро. – Strawberry

ответ

2

Попробуйте что-то вроде сильфона (может потребоваться изменить его, хотя):

SELECT p.col_item_name, SUM(p.col_no_of_items) - SUM (s.col_no_of_items) 
FROM tbl_purchased p 
left join tbl_sold s on p.col_item_name=s.col_item_name 
GROUP BY p.col_item_name; 
+0

Спасибо, Андрей Филимон .. – samrukshan

0

Или вы могли бы использовать

SELECT col_item_name, SUM(no_purchased) - SUM(no_sold) AS item_stock 
FROM 
    (SELECT col_item_name, col_no_of_items AS no_purchased, 0 AS no_sold 
    FROM tbl_purchased 
    UNION ALL 
    SELECT col_item_name, 0 AS no_purchased,col_no_of_items AS no_sold) 
GROUP BY col_item_name 
+0

onedaywhen Kep Brown .. – samrukshan

0

Это прекрасно работает для вас

SELECT, стр. name, ((SELECT SUM (НЕТ) ОТ purcahse ГДЕ name = p.name) - (SELECT COALESCE (СУММА (НЕТ), 0) ОТ sell ГДЕ name = s.name)) , оставшиеся от purcahse р LEFT JOIN sell с ПО p.name = s.name GROUP BY p.name;

пользуется спасибо :)

+0

Что такое 'purcahse' – Strawberry

+0

purcahse is ur buy table and sale is ur sale table –

+0

Это не мое, но почему бы не назвать его' покупка' или 'tbl_purchased' – Strawberry

0

предложения: присоединиться к вашему первому табличному выражению (нужно дать реферированию имя, например, col_no_of_items_purchased) в tbl_curent_stock, то сделайте простую арифметику. Вы также должны рассмотреть предметы, которые не были приобретены путем анти-присоединения. Затем UNION два вместе:

SELECT col_item_name, 
     col_no_of_items - col_no_of_items_purchased AS col_no_of_items 
FROM tbl_curent_stock 
    NATURAL JOIN 
    (SELECT col_item_name, 
       SUM(col_no_of_items) AS col_no_of_items_purchased 
     FROM tbl_purchased 
     GROUP 
      BY col_item_name) AS t 
UNION 
SELECT col_item_name, col_no_of_items 
    FROM tbl_curent_stock 
WHERE col_item_name NOT IN (SELECT col_item_name 
           FROM tbl_purchased); 
+0

Спасибо, что он ... – samrukshan

Смежные вопросы