В БД есть 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
- продажи.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
На локальном сервере возникает такая ошибка при попытке сменить кодировку и сопоставление таблицы на utf8mb4, а на удаленном - нетПричину ошибки...