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

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

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

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

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

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

снова я о своем)
есть таблица прихода/расхода PRIHRASH
есть поле MAINSTATE которое принимает 2 значения (1 - приход, 2 - расход)
есть серийный номер товара
и например получается такая табличка
serial count MainState
A001 1 1
A001 1 2
A002 1 1
A003 1 1
Из которой видно, что товар А001 пришел и его потом забрали, а товар А002 и А003 пришел и его ни кто не забирал
Как сделать запрос который выбирал бы все записи у которых mainState = 1 (приход), а потом удалял бы из этого списка те у которых mainState = 2? но при этом с учетом поля serial

В общем что бы в списке результата были только остатки A002 и A003?
Antony41 вне форума Ответить с цитированием
Старый 12.12.2015, 11:53   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

СУБД какая?
Вложенные запросы поддерживает?


если вкратце, то нужно сгруппировать таблицу по полю Serial,
просуммировать все значения count для MainState =1(приход) и отнять сумму значений Count для MainState =2(расход),
отобразить все записи, где полученная разность не равна нулю (кстати, если получится (вдруг) значение меньше нуля - то это признак ошибки в данных - отдали больше, чем пришло.

p.s. название поля count выбрано плохо, оно совпадает к ключевым словом SQL, потенциально возможны баги и косяки... я бы переименовал поле, если это возможно, конечно.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.12.2015, 12:19   #3
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Having .
come-on вне форума Ответить с цитированием
Старый 12.12.2015, 12:54   #4
Antony41
Пользователь
 
Аватар для Antony41
 
Регистрация: 20.03.2009
Сообщений: 99
По умолчанию

БД FireBird 2.5

если можно примерчик

Последний раз редактировалось Stilet; 12.12.2015 в 16:11.
Antony41 вне форума Ответить с цитированием
Старый 12.12.2015, 14:00   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

что насчёт count ?

http://www.ibase.ru/firebird/Firebir...erence_RUS.pdf
Цитата:
Приложение C:
Зарезервированные
и ключевые слова
Зарезервированные слова являются частью языка SQL Firebird. Они не могут быть
использованы в качестве идентификаторов (например, имён таблиц или процедур), за
исключением случаев когда они заключены в двойные кавычки (при использовании 3 диалекта).
Вы должны стараться избегать их использования, если на то нет серьёзных причин.
а когда переименуете поле Count во что-нибудь более приемлимое (например, в CountGoods)

тогда попробуйте выполнить такой SQL запрос:
Код:
select serial,
sum(case MainState 
  when 1 then CountGoods
  when 2 then -1*CountGoods
  else 0 end) as QuantityGoods
from PRIHRASH
group by serial

Последний раз редактировалось Stilet; 12.12.2015 в 16:11.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.12.2015, 14:12   #6
Antony41
Пользователь
 
Аватар для Antony41
 
Регистрация: 20.03.2009
Сообщений: 99
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Да пока что поле переименовал на Cnts, спасибо за замечание

всё получилось Serge_Bliznykov спасибо Вам огромное

Последний раз редактировалось Stilet; 12.12.2015 в 16:11.
Antony41 вне форума Ответить с цитированием
Старый 12.12.2015, 14:35   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

всегда пожалуйста!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.12.2015, 14:45   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
всё получилось
А как с условием по остатку решил проблему? И просто -CountGoods достаточно без умножения на -1
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.12.2015, 15:02   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А как с условием по остатку решил проблему?
хороший вопрос.
если бы меня спросили, что дальше, я бы предложил это всё во вложенный подзапрос перенести, а во внешнем сделать условие where QuantityGoods<>0
но интересно, как автор решил этот вопрос...


Цитата:
Сообщение от Аватар Посмотреть сообщение
И просто -CountGoods достаточно без умножения на -1
спасибо.
я не знал, как FireBird воспримет, поэтому перестраховался чуток...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.12.2015, 22:31   #10
Antony41
Пользователь
 
Аватар для Antony41
 
Регистрация: 20.03.2009
Сообщений: 99
По умолчанию

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

Код:
select * from (
		select sklad_id, equip_id, serial,
		sum(case MainState 
		  when 1 then Cnts
		  when 2 then -Cnts
		  else 0 end) as QCnts
		from PRIHRASH
		group by sklad_id, equip_id, serial)
where QCnts <> 0
Antony41 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выбрать ячейки а считать другие ячейки BigVito Microsoft Office Excel 5 22.12.2012 18:56
При освобождении обьекта TThread, он вешает всю программу. При этом код Execute у TThread уж выполнился.. Человек_Борща Общие вопросы Delphi 23 30.11.2011 09:18
игра - пушка стреляет ядром и при этом надо выбрать скорость и угол. посередине стоит преграда hasana Паскаль, Turbo Pascal, PascalABC.NET 1 20.05.2010 01:02
Выбрать повторяющиеся записи Andrei SQL, базы данных 2 13.09.2007 14:28
Как выбрать при помощи SQL записи из набора данных pris БД в Delphi 4 22.05.2007 11:24