Помогите, плиз, в объединении таблиц (или что-то типа этого)

Статус: Offline
Реєстрація: 06.03.2008
Повідом.: 215
Помогите, плиз, в объединении таблиц (или что-то типа этого)

Подскажите, пожалуйста... Никак "красиво" не могу решить проблему:
есть допустим 3 таблицы (FireBird):
1 - Товар (наименования)
2 - Приход товара (поля: 1- товар из табл 1, 2-кол-во, 3-дата прихода)
3 - То же самое (2), только расход.
Можно ли сделать запрос на просмотр наличия на складе на любую дату с начала работы склада?
Все работает, но если сразу c закупкой забивать в табл 3 нулевую продажу и их потом не учитывать. Или делать промежуточную таблицу, сформированную вручную..
Любое наличие товара и отсутствие продажи на какую-то дату ведет в результате к NULL, если их вычислять (Х-NULL=NULL) ...
Вроде передумал, что знал и не знал. Либо не знаю как правильно вопрос задать в гуглях либо...

Заранее благлдарен за ответ!
:confused:
 
Останнє редагування:
пришли базу с несколько десятками записей, можно в асю
 
Как вариант мона написать storeproce в fb
а потом дергать ее.
Т.е.
в сторепроце 3 переменных
кол-во приход=Select приход на дату
кол-во расход=Select расход на дату
итого=кол-во приход-кол-во расход
 
Спасибо!

Ну, прийдется так и сделать, если не домучаю СЕЛЕКТ... без PSQL

T-Товар, Р - Приход, R- расход:


select T.T_Name,
case
when sum(R.R_Quant) is NULL then sum(P.P_Quant)
else sum(P.P_Quant)-sum(R.R_Quant)
end
from Tovar T
Left Outer join Prihod P on P.P_Number = T.t_number
Left Outer join Rashod R on R.R_Number = T.t_number
group by T.T_Name

Результат выдает, но изначально Сумма прихода по позициям не правильно считается (в столько раз больше, сколько ей соответствует записей в таблице расхода ).
Догадываюсь, что не правильно, но не понимаю как исправить.
Если брать одну таблицу прихода - подстановка работает, а при подключении второй - в сумме выдет черт знает что...
Может кто подскажет, или не мучаться..
 
Я не cилён в особенностях диалекта sql fb, но если верить firebirdsql точка org, то такой вариант запроса должен работать:

select
T.T_Name,
(select sum(P.P_Quant) from Prihod P where P.P_Number = T.t_number) Prihod,
(select sum(R.R_Quant) from Rashod R where R.R_Number = T.t_number) Rashod
from Tovar T

в колонках Prihod/Rashod будет null, если соответствующих записей - нет.

На том же сайте написано как побеждать null значения в выражениях (не проверял ввиду наличия отсутствия fb ;)):

select
T.T_Name,
coalesce((select sum(P.P_Quant) from Prihod P where P.P_Number = T.t_number), 0)
- coalesce((select sum(R.R_Quant) from Rashod R where R.R_Number = T.t_number), 0) Ostatok
from Tovar T

это - "академический" способ выяснения остатка на складе, в действительности, обычно, используются две таблицы (с "текущими" остатками и "историей" по дням).
 
А я бы сначала объединила таблицу 2 и табл 3 union-ом (можно в хранимой проц)

select P_Number ,P_Quant from Prihod where условие_с_датой
Union
select P_Number ,-R_Quant from Rashod where условие_с_датой

Потом бы соединила результат с табл 1

select T.T_Name,sum(ХP.P_Quant)
from Tovar T Left Outer join ХранПроц ХP on ХP.P_Number = T.t_number
group by T.T_Name

Мне кажется, что так проще.
 
Подскажите, пожалуйста... Никак "красиво" не могу решить проблему:
есть допустим 3 таблицы (FireBird):
1 - Товар (наименования)
2 - Приход товара (поля: 1- товар из табл 1, 2-кол-во, 3-дата прихода)
3 - То же самое (2), только расход.
Можно ли сделать запрос на просмотр наличия на складе на любую дату с начала работы склада?
Все работает, но если сразу c закупкой забивать в табл 3 нулевую продажу и их потом не учитывать. Или делать промежуточную таблицу, сформированную вручную..
Любое наличие товара и отсутствие продажи на какую-то дату ведет в результате к NULL, если их вычислять (Х-NULL=NULL) ...
Вроде передумал, что знал и не знал. Либо не знаю как правильно вопрос задать в гуглях либо...

Заранее благлдарен за ответ!
:confused:
Если Вы только на этапе проектирования я бы Вам посоветовал соединить таблицу расходов и приходов в одну т.к. у вас все равно эти 2 таблицы идентичны и различаются только операцией. Добавите дополнительное поле где и будете указывать приход это или расход. А так у Вас получается избыточность в метаданных которая никчему хорошему не приведет.
P.S. И еще посоветовал бы Вам разобраться с хранимыми процедурами в FireBird и не делать выборки в клиентской части, если будете использовать базу в сети то будете засорять трафик ненужными перекачиваниями данных, а так у Вас хранимая процедура отберет нужные данные и вернет готовый набор данных.

По поводу запроса можеш попробовать так:
Select T.Tovar_Name,
Sum(P.Prixod_Sum) as Summa_P,
Sum(R.Rasxod_Sum) as Summa_R,
Sum(P.Prixod_Sum) - Sum(R.Rasxod_Sum) as Ostatok
From Tovar T
Left Join Prixod P On P.Id_Tovar = T.Id_Tovar and P.Date >= Date_Begin and P.Date <= Date_End
Left Join Rasxod R On R.Id_Tovar = T.Id_Tovar and R.Date >= Date_Begin and R.Date <= Date_End
Group By T.Tovar_Name

Скрипт не проверял на реальных данных поэтому могут быть ошибки.
 
Сорри за "оперативность"...Думал, что тема уже мертвая для обсуждения!
:диявол:ПИСЕЦ!!!!! Если бы не запутался в таблицах....
Спасибо за варианты решения.... с хранимыми процедурами - разбираюсь, с представлениями тоже, но вот после "мозговой атаки"...

select
T.T_Name,
coalesce((select sum(P.P_Quant) from Prihod P where P.P_Number = T.t_number), 0)
- coalesce((select sum(R.R_Quant) from Rashod R where R.R_Number = T.t_number), 0) Ostatok
from Tovar T

Она все-таки работает!!! Спасибо eugene_kr... Я там тоже это прочитал и пробовал... только попутал таблицу товаров с другой и из-за этого бился в конвульсиях! (должно работать а выдает НУЛЛ) :D

Объединить таблицы не хотелось бы - не только перечисленные поля туда входят, а 2 вспомагательные тоже добавлять не хочется (пусть даже меня осудят за это). Хотя... Я над этим подумаю, но не сегодня...:)

Спасибо всем! :пиво:
 
Останнє редагування:
Назад
Зверху Знизу