2011-02-03 2 views
0

У меня есть две таблицы с именами stock_in и stock_out со следующими columsполучать суммы от двух diffrent таблиц SQL

stock_in (recid,itemid,units) 

stock_out (recid,itemid,units) 

то, что я хочу, чтобы получить сумму единиц из обеих таблиц, а затем вычислить остальные блоки из stock_in в stock_out где я могу указать ItemID для любого элемента

Благодарности

+2

Когда вы запрашиваете помощь при написании запросов к базе данных, вы должны пометить вопрос с помощью своей РСУБД. SQL - это SQL, но в реальном мире все запросы не выполняются на всех RDBMS - синтаксис и доступные функции различаются. –

+1

Нет, не помещайте его словом «РСУБД». Пометьте те, с которыми вы используете систему управления реляционными базами данных - SQL Server, Sybase, Oracle, Postgres, MySQL и т. Д.? –

+1

'sql' сам по себе все еще является допустимым тегом, если (1) вы хотите, чтобы поставщики-агностические решения или (2) вы хотите знать о« стандартном »SQL. – paxdiablo

ответ

4
SELECT 
    (SELECT SUM(units) FROM stock_in WHERE itemid = 7) - 
    (SELECT SUM(units) FROM stock_out WHERE itemid = 7) 
    AS difference; 
+0

Да, но если я хочу видеть разницу только для одного элемента? – air

+0

Добавить 'WHERE itemid = #' предложения к подзапросам –

+0

@Dan Grossman Я думаю, что плакат хочет получить результаты как '(itemid, difference)' или аналогичные. Не очень полезно различать все предметы при получении разницы для одного элемента. –

1

сделать хранимую процедуру из него

SELECT @SUM1=SUM(*) 
FROM STOCK_IN 
SELECT @SUM2=SUM(*) 
FROM STOCK_OUT 

SELECT @[email protected] 

То самое лучшее решение, которое я могу думать, один упомянутый Dan не работает с использованием двух из, фактическая работа является внутреннее соединение

1

Поскольку это под PHP:

$queryString = "SELECT 
    SUM(stock_in.units) - SUM(stock_out.units) as difference 
FROM 
    stock_in 
INNER JOIN stock_out 
ON stock_in.itemid=stock_out.itemid 
WHERE stock_in.itemid = ".$value_to_query; 
$result = mysql_query($queryString); 

тесты:

create database sumgetter; 
use sumgetter; 
CREATE TABLE stock_in (
     recid INT, 
     itemid INT, 
     units INT 
); 
CREATE TABLE stock_out (
     recid INT, 
     itemid INT, 
     units INT 
); 
INSERT INTO stock_in VALUES (1, 1, 2); 
INSERT INTO stock_out VALUES (1, 1, 3); 
INSERT INTO stock_in VALUES (2, 2, 2); 
INSERT INTO stock_out VALUES (2, 2, 2); 

SELECT 
    SUM(stock_in.units) - SUM(stock_out.units) as difference 
FROM 
    stock_in 
INNER JOIN stock_out 
ON stock_in.itemid=stock_out.itemid 
WHERE stock_in.itemid = 1; 

// Результат

+------------+ 
| difference | 
+------------+ 
|   -1 | 
+------------+ 
1 row in set (0.00 sec) 
+0

его для php, но это дает неправильный результат, это добавляет значение_шт. 2 раза ... – air

+0

Извините. У меня есть новая машина - просто установите MySQL сейчас, чтобы я мог проверить ее правильно. –

+0

Я добавил некоторый тест SQL выше –

2
select 
    stock_in.itemid, 
    sum_stock_in.sum as sum_in, 
    sum_stock_in.sum as sum_out 
from 
    stock_in 
    left join (
     select itemid, sum(units) as sum from stock_in group by itemid 
    ) as sum_stock_in on sum_stock_in.itemid = stock_in.itemid 
    left join (
     select itemid, sum(units) as sum from stock_out group by itemid 
    ) as sum_stock_out on sum_stock_out.itemid = stock_in.itemid 
where 
    stock_in.itemid in (1, 2, 3) 

-- edit: 
group by 
    stock_in.itemid 

В этом запросе предполагается, что stock_out является подмножеством stock_in, т. Е. Stock_in содержит все возможные элементы itemid.

+0

+1 Не уверен, что это действительно то, чего хочет плакат, но он, по крайней мере, учитывает сами предметы :) –

+0

Мне действительно нравится решение Дэна (разница между результатами двух подзапросов), но в большинстве случаев больше данных, чем просто требуется одиночный номер. Это может быть полезно, если автору нужно (1) больше информации, чем просто разница в (2) списке предметов. – binaryLV

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