В БД есть 2 таблицы: Куплено и Продано, в которых записаны соответствующие операции, примерно так :
Столбцы: (Вид товара/Количество)
Строки : (Товар А/200 штук), (Товар А/100 штук), (Товар В/50 штук)
Принцип заполнения актуален и для Продано и для Куплено. В приложении нужно получить выборку : sum(Куплено.Количество) - sum(Продано.Количество).
Иначе говоря из 2х таких таблиц
Куплено
Продано
Нужно получить такую
Осуществить это я пытался таким запросом:
SELECT sum(CountPaper)
FROM custodian.activessale
where OrderNumber = 'ES2890'
group by TitleSalePaper into @res;
SELECT Title, round((sum(PaperCount) - @res),3)
FROM custodian.activesb
where OrderNumber = 'ES2890'
group by Title;
Проблема в том, что более одной строки в таблице Продано вызывают ошибку, а если строка одна, то она и вычитается из всех строк, независимо от того, какой товар был продан. Можно, конечно, завести отдельную таблицу, и туда записывать через Update баланс после покупки или продажи, но если можно через запрос выводить нужное значение, то и таблицы отдельной заводить не нужно. Или вообще приложение само должно все просчитывать. Подскажите как лучше? Можно ли запросом получить корректную таблицу ?
Если я правильно понял, то вам нужен примерно такой запрос:
select b.Title,
sum(b.PaperCount) - sum(s.CountPaper) as Title_diff
from custodian.activesb b join custodian.activessale s
on b.Title = s.TitleSalePaper
group by b.Title
SELECT products.product, COALESCE(SUM(purshase.amount),0) - COALESCE(SUM(selling.amount),0) balance
FROM ( SELECT product FROM purshase
UNION
SELECT product FROM selling
) products
LEFT JOIN purshase on purshase.product = products.product
LEFT JOIN selling on selling.product = products.product
GROUP BY products.product
Спасибо всем за помощь (особенно @Mike и @Denis) С вашими примерами пришел к следующему коду для Mysql
SELECT `Title`, coalesce(sum(col1),0)-coalesce(sum(col2),0)
FROM (
SELECT `Title`, `CountPaper` AS col1, NULL AS col2
FROM activesb where OrderNumber = 'ES2890'
UNION ALL
SELECT `Title`, NULL AS col1, `CountPaper` AS col2
FROM activessale where OrderNumber = 'ES2890'
) X
GROUP BY `Title`
где Title - столбец с названием товара (одинаков для обоих таблиц),
CountPaper - количества товара, OrderNumber - фильтр (проводя аналогию с примером, который дал по ссылке @Mike это какой то отдельный магазин из сети)
ну а activesb - поступления и activessale - продажи.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости