Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-1093110577
Ragazor
2004-08-21 21:49
2004.09.05
Delphi & 1C


1-1093033660
HydraMarat
2004-08-21 00:27
2004.09.05
Поток загружает процессор на 100%


1-1093081640
Рома
2004-08-21 13:47
2004.09.05
Что-то не то с библиотекой


3-1092226739
fedor
2004-08-11 16:18
2004.09.05
Как в FastReport 3 отобразить содержимое StringGrid?


3-1088953171
Falendysh
2004-07-04 18:59
2004.09.05
Изображение в BLOB поле через Query





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский