Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.05;
Скачать: CL | DM;

Вниз

Как составить оптимальный запрос?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.036 c
1-1093237821
Марат
2004-08-23 09:10
2004.09.05
Изменение цвета строки StringGrid


1-1093003639
kukuikar
2004-08-20 16:07
2004.09.05
Я изменил Dialogs.pas. Как мне переделать Dialogs.dcu?


1-1092906066
shc
2004-08-19 13:01
2004.09.05
Получение экземпляра класса за его интерфейсом


3-1092131443
natasha
2004-08-10 13:50
2004.09.05
Unicode в Delphi 2


14-1092373880
DION
2004-08-13 09:11
2004.09.05
Как узнать...Присутствует ли клавиатура???