Форум: "Базы";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
ВнизКак составить оптимальный запрос? Найти похожие ветки
← →
Lika (2004-08-11 11:43) [0]Есть одна таблица в которой хранится приход товара и расход товара т.е состоит из полей "код товара", "кол-во", "цена"... и есть поле "тип" в котором, если значение =0, то это приход, если начение =1, то это расход. Нужно найти остатки товаров. Подскажите самый оптимальный способ это сделать, может запросом или несколькими, а может еще как?
← →
Sandman25 © (2004-08-11 11:47) [1]Оптимальный способ - триггер и дополнительная табица.
А вообще для IB6 можно через
select sum(..) from ... where приход
и
select sum(..) from ... where расход
Результаты проанализировать на null и вычесть.
← →
Lika (2004-08-11 12:10) [2]А можно поподробнее. Сделать два запроса в первом весь приход по каждому товару, а во втором расход. А как потом проанализировать и вычесть? В цикле?
← →
Sandman25 © (2004-08-11 12:17) [3]В хранимой процедуре. Это если нужно по конкретному товару.
Если нужно по всем товарам, то будут проблемы, ибо не поддерживается ни case, ни iif. Скорость резко упадет.
← →
Sergey13 © (2004-08-11 12:17) [4]Если бы тип имел значения -1 и 1 то
select tovar,sum(kol*tip) from table
group by tovar
давало бы нужный результат. Можно свою фунцию написать для возврата -1 и 1 из 1 и 0.
← →
stas_x (2004-08-11 12:21) [5]
Sergey13 © (11.08.04 12:17) [4]
давало бы нужный результат. Можно свою фунцию написать для возврата -1 и 1 из 1 и 0.
Илм Update сделать. У меня так же работает склад только 1 и -1 и нет никаких проблем !
← →
Sergey13 © (2004-08-11 12:29) [6]2 stas_x (11.08.04 12:21)
Можно, если на 0 и 1 е завязана другая функциональность. Мало ли.
← →
Lika (2004-08-11 12:33) [7]Спасибо большое, такой вариант меня конечно очень бы устроил - все решилось бы одним запросом. Я об этом тоже думала. А если несколько складов, т.е есть поля "склад прихода", "склад расхода" , для какого-то склада это приход, а для какого-то расход, тогда как быть? Что записывать в поде "тип"? .....
← →
Danilka © (2004-08-11 12:35) [8]Ну, если здеся ярмарка вариантов, то тогда можно еще одно поле добавить, заполняемое триггером, куда писать кол-во с плюсом для прихода и с минусом для расхода тогда вообще ничего умножать не надо будет. :))
А вообще, при такой постановке когда-нибудь возникнет ситуация, что динамически рассчитывать остатки с начала времен станет очень накладно по-времени. И придется сделать отдельный регистр для хранения остатков, либо текущих, либо, остатки с определенной периодичностью, например, на начало каждого месяца.
← →
Sandman25 © (2004-08-11 12:36) [9][7] Lika (11.08.04 12:33)
2 записи закладывать, по одной для каждого склада. И никаких полей типа откуда и куда. Только куда.
← →
Sergey13 © (2004-08-11 12:37) [10]2[7] Lika (11.08.04 12:33)
select sklad,tovar,sum(kol*tip) from table
group by sklad,tovar
← →
Danilka © (2004-08-11 12:37) [11][7] Lika (11.08.04 12:33)
> т.е есть поля "склад прихода", "склад расхода"
Это уже другая таблица, другая идеология. В этом случае одна запись будет являтся и приходом и расходом, в теме ветки-же у тебя описана структура когда одна запись это либо приход, либо расход.
Это две несовместимые в одной таблице вещи.
← →
Lika (2004-08-11 12:46) [12]
> Danilka © (11.08.04 12:37) [11]
> Это уже другая таблица, другая идеология.
Да я согласна. Просто я хотела упростить вопрос вначале. С первым вариантом я для себя уже уяснила, -1 и 1 это спамый удачный вариант. Хочу еще второй вариант прояснить.
Я вообще понимаю что такие задачи они типичные, но мне бы хотелось узнать оптимальный вариант их решения?
← →
Sandman25 © (2004-08-11 12:47) [13][12] Lika (11.08.04 12:46)
Оптимальный вариант - записывать отрицательное количество для расхода + триггеры + срезы, о которых писал Danilka
← →
Sergey13 © (2004-08-11 12:51) [14]2[12] Lika (11.08.04 12:46)
А чем [10] не устраивает?
>В этом случае одна запись будет являтся и приходом и расходом
Так делать не надо. Надо 2 записи в приходно-расходной таблице и одна запись в таблице документов на передачу. Ибо приход и расход на разных складах могут быть совершенно разными процессами и расходиться как во времени так и в количестве (как ни странно).
← →
sniknik © (2004-08-11 13:01) [15]а так не пойдет?
SELECT "код товара", Sum(("тип"*-1)*"кол-во")
FROM "Есть одна таблица"
GROUP BY "код товара"
← →
Danilka © (2004-08-11 13:12) [16][15] sniknik © (11.08.04 13:01)
в смысле?
"тип" это либо 1 либо 0.
(тип*-1) получается что либо -1 либо 0, если 0 умножить на количество, то получим 0.
может-быть имелось ввиду это:
-(тип-0.5)*2
?
← →
sniknik © (2004-08-11 13:16) [17]Danilka © (11.08.04 13:12) [16]
да, бред получился. ;о))
написал а только после проверять стал.
> может-быть имелось ввиду это:
наверное, сммысл 1 и -1 получить (так хотел), у тебя вроде похоже. счас проверю.
← →
Sandman25 © (2004-08-11 14:20) [18][16] Danilka © (11.08.04 13:12)
Чтобы были только целочисленные операции, можно написать 1-2*tip
← →
Lika (2004-08-11 14:22) [19]Спасибо ребята всем большое!
-(тип-0.5)*2- это вообще прикольно, удачное решение, даже в голову не пришло :))
Еще раз всем спасибо!
← →
Danilka © (2004-08-11 14:24) [20][19] Lika (11.08.04 14:22)
> -(тип-0.5)*2
Лучше все-таки раскрыть скобки, как в [18] Sandman25 © (11.08.04 14:20)
:))
← →
Deniz © (2004-08-11 14:28) [21]тип*2-1 и никаких гвоздей ... дробей
← →
Lika (2004-08-11 14:35) [22]
> Danilka © (11.08.04 14:24) [20]
> Лучше все-таки раскрыть скобки, как в [18] Sandman25 ©
> (11.08.04 14:20)
Да, да правильно. Сразу не заметила.:)
А может кто-нибудь может дать ссылку на хорошую статью(литературу), где описанны правильные решения таких типовых задач. Может и структуру БД можно было бы удачнее построить, в общем не хотелось бы изобретать велосипед, когда он уже давно создан. Была бы очень признательна :)
Еще раз всем спасибо, что помогли!
← →
Sergey13 © (2004-08-11 15:24) [23]2[22] Lika (11.08.04 14:35)
На отсутствии такой литературы толпы людей кормятся. Ты на что посягаешь? 8-)
← →
Lika (2004-08-11 15:31) [24]
> Sergey13 © (11.08.04 15:24) [23]
> На отсутствии такой литературы толпы людей кормятся. Ты
> на что посягаешь? 8-)
Все ясно:)) Просто задачи часто попадаются уж очень типичные, с которыми большинство программистов сталкиваются. У меня конечно есть свои методы их решения, но не всегда они мне кажутся оптимальными. Вот и хочется позаимствовать чужой опыт, в таких вопросах:))
← →
Sergey13 © (2004-08-11 15:34) [25]2[24] Lika (11.08.04 15:31)
>Вот и хочется позаимствовать чужой опыт, в таких вопросах:))
Вот и пиши сюда, спрашивай. 8-)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.034 c