Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2009, 01:59   #1
exile
Новичок
Джуниор
 
Регистрация: 15.03.2009
Сообщений: 2
По умолчанию Разность двух таблиц

Здравствуйте. Изложу сразу суть вопроса. Есть две таблицы Prihod (N_Prih, Tovar, Kolich) и Rashod (N_Prod, Tovar, Kolich). Надо в новой таблице рассчитать оставшееся количество товара. Я пробовал осуществить это через запрос:
SELECT p.tovar, (SUM( p.kolich ) - SUM( r.kolich )) Vsego
FROM prihod p
INNER JOIN rashod r
ON (p.tovar = r.tovar)
GROUP BY p.tovar

Но он дает не верные решения, к примеру, один из вариантов: имеется мука в количестве 100 ед., продали 40 ед. после запроса выдает, что осталось 260ед.
Исходил из того, что привоз товара может быть не однократен. Возможно, я замудрил что-то. Подскажите, в чем я ошибся, если была такая тема раскрыта ранее, подскажите её адрес.
С уважением Exile
exile вне форума Ответить с цитированием
Старый 15.03.2009, 12:32   #2
Антон Ю.Б.
Форумчанин
 
Регистрация: 03.01.2009
Сообщений: 116
По умолчанию

exile, в Firebird 2.1 (IIF и Derived Tables ("select from (select ...") появились только в 2.1) получилось вот так:

select P.TOVAR, IIF(R.KOLICH IS NULL, P.KOLICH, P.KOLICH-R.KOLICH)
from (SELECT TOVAR, SUM(KOLICH) KOLICH from PRIHOD GROUP BY TOVAR) P
left JOIN (SELECT TOVAR, SUM(KOLICH) KOLICH from RASHOD GROUP BY TOVAR) R
on P.TOVAR=R.TOVAR;

но запросец должен быть затратным. Надо либо таблицы регулярно чистить, либо хотя бы ограничения по дате вводить на подзапросы.

Последний раз редактировалось Антон Ю.Б.; 15.03.2009 в 12:35.
Антон Ю.Б. вне форума Ответить с цитированием
Старый 15.03.2009, 14:30   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

exile, а какую СУБД используете?

если допускаются вложенные запросы (select * from (select...))
тогда я бы предложил сначала объединить обе таблицы в одну через union, только kolich из таблицы расход умножил на -1

а потом банальный sum( kolich ) from <объединённая таблица>:

Код:
select TOVAR, sum(UKol) from 
( select TOVAR, kolich as UKol from prihod 
 union all
  select TOVAR, kolich*(-1) as UKol from rashod )
group by TOVAR
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.03.2009, 22:34   #4
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

У меня на таблице Paradox получилось так:
Код:
SELECT Tovar, (SELECT SUM(Kolich) FROM Prihod WHERE Tovar = 'Мука') - (SELECT SUM(Kolich) FROM Rashod WHERE Tovar = 'Мука') as Ostatok
FROM Prihod
WHERE Tovar = 'Мука'
GROUP BY Tovar
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 15.03.2009 в 22:45.
Yurk@ вне форума Ответить с цитированием
Старый 16.03.2009, 09:27   #5
exile
Новичок
Джуниор
 
Регистрация: 15.03.2009
Сообщений: 2
По умолчанию

Всем большое спасибо за помощь
exile вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение двух таблиц jekis2506 Microsoft Office Excel 5 15.04.2009 08:34
SQL запрос из двух таблиц.(сложный) Miha87 БД в Delphi 5 10.11.2008 11:04
Выорка данных Select из двух связанных таблиц... hijke БД в Delphi 0 28.10.2008 08:24
Как оптимизировать запрос MySQL с выборкой из двух таблиц. Johnatan SQL, базы данных 6 13.04.2008 03:10