Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];

Вниз

Помогите с SQL-запросом   Найти похожие ветки 

 
Couter Terranist   (2006-04-13 22:57) [0]

Доброе время суток!
Помогите полалуста разобратся в следующей ситуации:
Есть 2 таблицы:
 RawNames  Артикули и имена сирья
   Raw_Code,  Raw_Name,  Raw_Unit...

 RawIncoming  поставки сирья
   RI_No, RI_Code, RI_Date, RI_Count, RI_Remark

Задача будто очень простая и обычная но на SQL єто для меня проблема...
Мне нужен запрос которий видает отчет о наличии сирья на начало месяца, скоко за месяц пришло и скоко на конец периода осталось
Никак не придумаю как в один запрос всунуть несколько SUM"ов  каждый из которих суммирует приход только когда дата совпадает е "его" диапазоном
Также возможна ситуацыя когда сиръё есть в таблице имен сиръя но никогда еще не поставлялось (в отчете  оно должно быить, хотя и нолями)
Я додумался до следующего(для прототы примера я период дал фиксорований, хотя я его беру с MonthCalendar):

 Артикул|Начало периода | За текущий период | На конец периода

select ri_code,sum (ri_count),0,0
from rawincoming
where ri_date<"1.03.2006"
group by ri_code

union
select ri_code,0,sum (ri_count),0
from rawincoming
where ri_date between "1.03.2006" and "31.03.2006"
group by ri_code

union
select ri_code,0,0,sum (ri_count)
from rawincoming
where ri_date > "31.03.2006"
group by ri_code

union
select raw_code,0,0,0
from rawnames
where not raw_code = any
(select ri_code from rawincoming)

данный запрос хорош когда сиръё поставлялось только в один с периодов, иначе информацыя о конкретном сиръе повторяется но уже на другой период. Вот если бы этот запрос еще просуммировать групируя по артикулу...

Может для таких целей (учет поступлений на склад) следует по другому спроэктировать БД? БД парадокс

Понимаю что вопрос дилетанский но все же...


 
ANB ©   (2006-04-14 11:43) [1]


> БД парадокс

Это зря.

Сюда напрашивается таблица текущих остатков, иначе, когда база вырастет, остаток придется считать полной суммой по таблице движения, а это долго.

Задача решается использованием подзапросов в селектовой части.
Примерно вот так :
select Raw_Code,  Raw_Name,  Raw_Unit,
(select sum(RI.ri_count) from rawincoming RI where RI.ri_code = RN.Raw_Code and RI.ri_date < :BegDate
) Beg_Saldo,
(select sum(RI.ri_count) from rawincoming RI where RI.ri_code = RN.Raw_Code and RI.ri_date between :BegDate and :EndDate and RI.ri_count > 0) Prihod, -- Не помню, как приход по английски
(select sum(RI.ri_count) from rawincoming RI where RI.ri_code = RN.Raw_Code and RI.ri_date between :BegDate and :EndDate and RI.ri_count < 0) Rashod, -- Не помню, как расход по английски
select Raw_Code,  Raw_Name,  Raw_Unit,
(select sum(RI.ri_count) from rawincoming RI where RI.ri_code = RN.Raw_Code and RI.ri_date < :EndDate
) End_Saldo,
from RawNames RN

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


 
Couter Terranist   (2006-04-17 10:08) [2]

Расходы помоему удобнее подавать в таблице прихода зо знаком минус...


 
ANB ©   (2006-04-17 11:21) [3]


> Couter Terranist   (17.04.06 10:08) [2]

расходы нужно выдавать в отдельной колонке, а хранить их можно и с минусом. Но работать будет долго, т.к. индекс тут тяжело прикрутить. Хотя есть вариант с case, но вряд ли парадокс поддерживает такие сложные вложения.


 
Couter Terranist   (2006-04-17 14:01) [4]

Да и ввише приведенном примере столбци сум пустие
select Raw_Code,  Raw_Name,  
(select sum(RI.ri_count) from rawincoming RI where RI.ri_code = RN.Raw_Code and RI.ri_date < "1.03.06"
) Beg_Saldo,
(select sum(RI.ri_count) from rawincoming RI where RI.ri_code = RN.Raw_Code and RI.ri_date between "1.03.06" and "31.03.06" and RI.ri_count > 0) Prihod,
(select sum(RI.ri_count) from rawincoming RI where RI.ri_code = RN.Raw_Code and RI.ri_date between "1.03.06" and "31.03.06" and RI.ri_count < 0) Rashod,

(select sum(RI.ri_count) from rawincoming RI where RI.ri_code = RN.Raw_Code and RI.ri_date < "31.03.06"
) End_Saldo
from RawNames RN

я нашол причину но не понял ее смисла
упростил запрос:

select Raw_Code,  Raw_Name,  
(select sum(RI.ri_count) from rawincoming RI where RI.ri_code = RN.Raw_Code and RI.ri_date < "1.03.06"
) Beg_Saldo
from RawNames RN

видает последнее поле пустим. если убрать RI.ri_code = RN.Raw_Code  из where то в поле по всех записях стоит сума всех товаров поставленних до указаной дати, ну да єто понятно. ПОЧЕМУ С УЛОВИЕМ RI.ri_code = RN.Raw_Code ВИДАЕТСЯ ПУСТОЕ ПОЛЕ (NULL КАК Я ПОНЯЛ...)?


 
Couter Terranist   (2006-04-17 14:23) [5]

А таблицу текущего остатка уже сварганил
есть еще такой вопрос: предположим спустя некоторое время фирма отказалась от какогото вида сирья или поменяла артикулы, в таблице прихода/расхода за старие периоды будет запись под этим артикулом а в позние не будет, возможно ввод нового артикула в новый период и при просмотре старих периодов он конечно будет "по нолям" но стоит ли там вообще его показивать? Чтоби избежать етой рутины стоит ли создавать в конце каждово месяца чтото наподобе отчета и при просмотре инфы за прошлие периоды пользоватся запросом из прихода/расхода а этой таблицей
Например таблица имеет вид:
 месяц_год | артикул | название сиръя | сальдо на начало месяца | приход   |расход | на конец месяца
никаких связей с другими таблицами. Если информацыя о товарах модифицировалась то тут она будет отражена в виде актуальным для тогдашнего периода. Если же хочет пользователь инфу "в свежем формате" - используе запрос по приходу/расходу. ЦЕЛЕСООБРАЗНО ЛИ ЭТО?

єто моя первая проба в БД поєтому прошу сильно над дилетанством не смеятся)
Сори за плохой русский



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.012 c
8-1134488094
dirtur
2005-12-13 18:34
2006.05.07
Как можно в Delphi видеофайлы?


11-1125647309
PavelPro
2005-09-02 11:48
2006.05.07
TrayIcon и KOL


15-1145125767
Yegorchic
2006-04-15 22:29
2006.05.07
Новый земельный и водоохранный закон


8-1134409438
VasRoG
2005-12-12 20:43
2006.05.07
Загрузка bmp


4-1139945594
Volf_555
2006-02-14 22:33
2006.05.07
Как свернуть/развернуть все MDI-окна в моём приложении?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский