Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2015, 11:47   #1
Antony41
Пользователь
 
Аватар для Antony41
 
Регистрация: 20.03.2009
Сообщений: 99
По умолчанию остатки на складе запрос

Помогите составить запрос по остаткам
есть таблица оборудования и таблица прихода/расхода

таблица оборудования Equips выглядит


Таблица прихода расхода так PRIHRASH


Нужно расчитать по схеме
Название оборудования|Остаток на складе
поле mainState это статус
1 - пришло
2 - выдано сотруднику
3 - списано
остаток должен вычисляться по схеме всё что пришло - выданое сотруднику
Antony41 вне форума Ответить с цитированием
Старый 25.11.2015, 11:57   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А что тут каждое из полей означает?
Я например не пойму, что в накладной SERIAL делает, если это не номер накладной.
И MAINSTATE это код, показывающий что это, приход\расход\списание\и т.д. ?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.11.2015, 12:23   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Типа такого
Код:
SUM(CASE WHEN mainState=1 THEN count ELSE -count END)
И GROUP BY по складу и номенклатуре или чего там. Обычно есть еще начальные остатки и движение берется по некоторую дату, поскольку остатки на начало какого-то периода
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.11.2015, 20:34   #4
Antony41
Пользователь
 
Аватар для Antony41
 
Регистрация: 20.03.2009
Сообщений: 99
По умолчанию

есть некое оборудование которое поступает на склад
на склад оборудование может поступать либо
а)от поставщика, либо быть б)возвращено сотрудником
всё это дело запилино в 1 таблицу PRIHRASH
DATE - дата прихода/расхода
SKLAD_ID - склад на который пришел/ушел товар
EQUIP_ID - оборудование/товар это связь с Equips.ID
COUNT - кол-во товара/оборудования которое пришло /ушло
SERIAL - серийный номер оборудования
MAINSTATE - статус 1 - пришло, 2 - на руках, 3 - списано
MEMBER_ID - Работник который получил товар на руки связь
FOR_ORG - для какой огранизации

например оборудование пришло от кого то
значит например
24.11.2015|1|3|50|null|1|8|приход для клиента СеверАвтоДор
тоесть 50 шт пришло и mainstate = 1

далее оборудование может быть выдано какому то сотруднику на руки
например выдано 5 единиц этого же товара это му же сотруднику тогда запись такая
25.11.2015|1|3|5|null|2|8|
дальше сотрудник может либо установить это оборудование клиенту например усановил 3 шт., тогда его надо списать с рук сотрудника
25.11.2015|1|3|3|null|3|8|
или оно снова может быть возвращено на склад со статусом mainstate = 1 как приход или так и числиться на сотруднике

Так вот не могу понять как написать подсчет остатка на складе
Остаток на складе = Весь приход -(минус) всё оборудование которое когда либо получали сотрудники

например сотрудник всё же вернул те 3 единицы оборудования тогда
50(было от поставщика)+3(возврат сотрудника)-5 = 48

Цитата:
Обычно есть еще начальные остатки и движение берется по некоторую дату
Вы имеете ввиду то, что на момент установки программы "СКЛАД" какое то кол-во товаров уже содержится на складе.
Но я впринципе могу его завести и через приход например от поставщика (создав поставщика и обозвав его к примеру "Начальный остаток на складе")
Ну вот как то так

Последний раз редактировалось Antony41; 25.11.2015 в 20:54.
Antony41 вне форума Ответить с цитированием
Старый 25.11.2015, 20:56   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как написать подсчет остатка на складе
Аватар прав:
Код:
select
 SKLAD_ID,EQUIP_ID,SUM(CASE WHEN mainState=1 THEN count ELSE -count END)
from ...
group by 1,2
Если твоя СУБД конечно допускает такие агрегатные примочки.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.11.2015, 22:24   #6
Antony41
Пользователь
 
Аватар для Antony41
 
Регистрация: 20.03.2009
Сообщений: 99
По умолчанию

спасибо помогло. В итоге составил вот такой запрос
Код:
select
 SKLAD_ID,EQUIP_ID,SUM(
          CASE
            WHEN (mainState=1) THEN
              prihrash."COUNT"
            WHEN mainState=2 THEN
            -prihrash."COUNT"
            END)
 from prihrash
group by 1,2
по такому же принципу сделаю остаток на руках
Остаток на руках = Всё взятое со склада оборудование - списанное

Цитата:
Если твоя СУБД конечно допускает такие агрегатные примочки.
да забыл FireBird 2.5

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

Код:
select
 SKLAD_ID,EQUIPS.TITLE,EQUIP_ID,
 case when (
                SUM(
                    CASE
                    WHEN (mainState=1) THEN
                      prihrash."COUNT"
                    WHEN mainState=2 THEN
                      -prihrash."COUNT"
                    END
                   )
            ) is null then
            0
            else
              SUM(
                    CASE
                    WHEN (mainState=1) THEN
                      prihrash."COUNT"
                    WHEN mainState=2 THEN
                      -prihrash."COUNT"
                    END
                   )
            end OSTATOK
 from equips left join prihrash on prihrash.equip_id = equips.id
group by 1,2,3
еще он не выводит EQUIP_ID у тех значений у которых сумма равна 0

Последний раз редактировалось Stilet; 28.11.2015 в 18:19.
Antony41 вне форума Ответить с цитированием
Старый 27.11.2015, 12:00   #7
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Нет никакого ноля у вас, у вас left join, и про coalesce почитайте, пора в книгу заглянуть.
come-on вне форума Ответить с цитированием
Старый 27.11.2015, 12:04   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
помогите доработать запрос
Ну первое, что приходит в голову из классики:
Код:
                SUM(
                    CASE
                    WHEN (EQUIP_ID is null) THEN
                         0
                    WHEN (mainState=1) THEN
                      prihrash."COUNT"
                    WHEN mainState=2 THEN
                      -prihrash."COUNT"
                    END
                   )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.11.2015, 18:33   #9
Antony41
Пользователь
 
Аватар для Antony41
 
Регистрация: 20.03.2009
Сообщений: 99
По умолчанию

хех вот я тупой!))) спасибо Stilet

Цитата:
Нет никакого ноля у вас, у вас left join, и про coalesce почитайте, пора в книгу заглянуть.
Да перепутал наоборот когда null то нужно что бы было 0.
Да в книгу я заглядывал и инет штудировал просто нужно немного практики
Antony41 вне форума Ответить с цитированием
Старый 27.11.2015, 20:06   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
просто нужно немного практики
Бывает )))
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как посчитать остатки и обороти на складе, накладные товара и услуг вместе? bidzina БД в Delphi 10 01.12.2014 19:47
составить запрос, который выберет все товары хранившихся на складе не более 30 дней относительной прибыль не менее 20% Лучик2009 SQL, базы данных 1 20.02.2013 09:03
Остатки на складе Ardarik SQL, базы данных 8 15.02.2013 20:44
Остатки вируса HellMercenariess Безопасность, Шифрование 2 14.09.2010 04:14
Запрос: Сгруппировать остатки по периодам Black_Guardian SQL, базы данных 14 03.08.2009 15:02