Составление запроса на сумму и проверка на уникальность

olga802005

Имеется 2 таблицы, в которых кранятся данные о запчастях (Главная таблица "Запчасти")и зависимая таблица "Комплектация"в них содержатся названия Запчастей и кол-во спирта на их протирку в ЛИТРАХ.таблица "Запчасти"KodImteh, KodUcheta, IMTEH, ZN, SpirtТехЭкс, SpirtПищЭкстаблица "Комплектация"ID, KodImteh, KodUcheta, IMTEH, ZN, SpirtТехЭкс, SpirtПищЭкссвязаны по полю KodImtehсписок всех деталей, содержащих спирт на их обслуживание я вывожу так
SELECT KodImteh, KodUcheta, IMTEH, ZN,
SpirtТехЭкс, SpirtПищЭкс
FROM [SELECT 
KodImteh, KodUcheta, IMTEH,ZN, 
SpirtТехЭкс, SpirtПищЭкс
FROM Запчасти K
Where (SpirtТехЭкс is Not Null) or (SpirtПищЭкс is Not Null) 

UNION All
SELECT KodImteh, KodUcheta, IMTEH, ZN, 
SpirtТехЭкс, SpirtПищЭкс
FROM Комплектаци 
Where (SpirtТехЭкс is Not Null) or (SpirtПищЭкс is Not Null) 
ORDER BY KodIMTEH]. AS T;
мне нужно сделать запрос, чтобы из этого списка выводились лишь список тех деталей, чья сумма по полю SpirtТехЭкс составляла например 5 литров.И дату списания этого спирта.Плюс чтобы когда я запустил этот же запрос, например через месяц, то в запросе были не те детали что были месяц назад,а новый список. Т.е. уникальные всегда списки.А то списание спирта с одинаковыми деталями неправильно. Ведь их списали и значит не должно быть в новой выборке.Как это реализовать?Я вижу это так:1) создавать 2 пустые временные таблицы2) Каждый раз копировать данные из таблиц "Запчасти" и "Комплектация" во временные3) производить запрос на выборку с интересуещей меня суммой списания спирта4) запоминать коды списанных деталей из этих временных таблиц в 3-ю таблицу, которая будет пополняться кодами5) в п.3. проверять на то, чтобы новые коды были ОТЛИЧНЫЕ от тех, что храняться в 3-ей таблицеПравильно?
22 ответа

olga802005

olga802005,чем отличаются таблицы Запчасти и Комплектация? Почему их 2? Они же с совершенно одинаковыми полями?


olga802005

да с одинаковыми - просто у детали "поршневая" в таблице комплектации расписано его содержимое: кольца, палец и т.п.


olga802005

olga802005, полного понимания нет. Попробуйте запрос (написан, вообщем-то, от фонаря. Только чтобы связать таблицы)
Select Запчасти.*, Комплектация.*
From Запчасти Inner Join Комплектация On Запчасти.KodImteh=Комплектация.KodImteh
Where (Комплектация.SpirtТехЭкс is Not Null) or (Комплектация.SpirtПищЭкс is Not Null)
Два вопроса:- сумма по полю SpirtТехЭкс составляла например 5 литровКак суммировать? Какие записи должны пройти в сумму? Уточните. - Насчет вывода по дате - покажите поле даты списания в таблицах. Я его не увидел


olga802005

olga802005, полного понимания нет. Попробуйте запрос (написан, вообщем-то, от фонаря. Только чтобы связать таблицы)
Select Запчасти.*, Комплектация.*
From Запчасти Inner Join Комплектация On Запчасти.KodImteh=Комплектация.KodImteh
Where (Комплектация.SpirtТехЭкс is Not Null) or (Комплектация.SpirtПищЭкс is Not Null)
да - такое тоже работает
Два вопроса:- сумма по полю SpirtТехЭкс составляла например 5 литровКак суммировать? Какие записи должны пройти в сумму? Уточните.
суммировать любые записи содержащие в поле SpirtТехЭкс значение отличное от NULLи эти Наименования вывестиПоршень, 0,01 лКольца, 0,005 л....и т.д. т.е. список сумма которого дает по полю SpirtТехЭкс 5 литров
- Насчет вывода по дате - покажите поле даты списания в таблицах. Я его не увидел
его нет. В том то и дело что дата и необязательна. Нужно где то сохранять или метку на какой записи из предыдущего запроса достигла интересующая сумма.Или сохранять коды KodImteh в какой-нибудь таблице и при каждом запросе СНАЧАЛА сравнивать есть они уже там, а потом пополнять ее только что сформированными кодами новых названий.Раньше дело было так:1) ВРУЧНУЮ открывалась главная таблица "Запчасти"2) далее из нее наугад пользователь копировал определенное кол-во записей в эксель. Запоминая последний код скопированной записи3) Открывал таблицу "Комплектация" и копировал до Кода с главной формой и вставлял в конец экселе сразу после записей главной таблицыи матем функциями сумма смотрелась - если меньше или больше то корректировался экселевский файлИ в итоге в блокнотике пользователь записывал на какой записи остановился, чтобы если нужно еще было списать определенное кол-во спирта, то он бы начинал с этой позиции


olga802005

есть идеи?


olga802005

Вопросов, вернее недопонимания, столько, что и выписывать их лень. Попробуем от противного (не от омерзительного, а от противоположного )Вот такой запрос подойдет? Если нет, то почему?
Select k.ID, k.KodImteh, k.KodUcheta, Sum(k.SpirtТехЭкс) as Summa
From Запчасти z Inner Join Комплектация k On z.KodImteh=z.KodImteh
Where (k.SpirtТехЭкс is Not Null) or (k.SpirtПищЭкс is Not Null)
Group By k.ID, k.KodImteh, k.KodUcheta
Having Sum(k.SpirtТехЭкс)>=<b>5</b>


olga802005

Добавлю. Поскольку никак не получается взаимопонимание, то имеет смысл вам здесь показать кусок таблички исходных данных и табличку желаемого выхода из этих же данных. На живых цифрах часто возникает прозрение.


olga802005

такой запрос не подойдет т.к. ни для каждой записи из главной есть связь с комплектациейпоэтому я и делала через Union ALLБазу прикрепила.Нужно получить полный список всех изделий, (как в таблице "запчасти" , так и из таблицы "комплектации" - объединив их предварительно) у которых поле с содержанием спирта имеет значение больше 0 (или отличное от NULL) и их сумма по этому полю равна 5 литрам. При след. запросе выводить новый уникальный (т.е. пред список уже участвовал в выборке и его как бы списали) список у которых тоже сумма по полю равна литрам cкачать


olga802005

суть в том что каждые 2-3 месяца в бухгалтерию нужно подавать новый список изделий, по которым человек списал 5 литров на их ремонт (протирку и т.п.)


olga802005

...При след. запросе выводить новый уникальный (т.е. пред список уже участвовал в выборке и его как бы списали) список у которых тоже сумма по полю равна литрам
...интересно стало, что автор вкладывает в эти слова ?


olga802005

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


olga802005

olga802005,- в обеих таблицах есть 4 спиртосодержащих поля. Какие же из них надо суммировать?- возможен ли расход спирта на одну деталь/запчасть в несколько приемов? И как это учитывается в таблицах?- если возможен расход в несколько приемов, то как это учитывается при накоплении до 5 литров? Предположим, учетчик сделал отчет, показал расход по детали. В промежутке до следующего отчета эту деталь еще раз протерли, расходовали спирт. Значит ее надо снова учитывать. А как? Где видны эти частичные протирки? - исходя из вашего требования не показывать в текущем отчете детали, которые были в предыдущем отчете, как быть с повторными протирками?


olga802005

- в обеих таблицах есть 4 спиртосодержащих поля.
жжошь!


olga802005

жжошь!
Мамой клянусь!


olga802005

Мамой клянусь!
задача - рассчитать процент содержания спирта в каждом поле!


olga802005

задача - рассчитать процент содержания спирта в каждом поле!
Задача в первом посте ТС. Сделать отчет о выпитых потраченных 5 литрах спирта. Но мастер не колется - поля пустые.


olga802005

mds_world,+100 , даже и не знаю, как сказать, чтобы не обидеть ТС.


olga802005

olga802005,1) в обеих таблицах есть 4 спиртосодержащих поля. Какие же из них надо суммировать?2) возможен ли расход спирта на одну деталь/запчасть в несколько приемов? И как это учитывается в таблицах?3) если возможен расход в несколько приемов, то как это учитывается при накоплении до 5 литров? Предположим, учетчик сделал отчет, показал расход по детали. В промежутке до следующего отчета эту деталь еще раз протерли, расходовали спирт. Значит ее надо снова учитывать. А как? Где видны эти частичные протирки? 4) исходя из вашего требования не показывать в текущем отчете детали, которые были в предыдущем отчете, как быть с повторными протирками?
1) сейчас по любому по любому из них . НАПРИМЕР "SpirtТехЭкс" - т.к. потом по аналогии я сделаю 4 запроса (по одному к каждому полю) по выводу интересующей пользователя суммы.2) нет. Написано число, вот его и нужно подсчитать 1 раз и включить в сумму и вывести в отчете название детали3) Нет эту деталь больше не нужно протирать. Списали по этой детали спирт раз в год и хватит.4) повторных протирок нет. Спирт на деталь назначается только 1 раз и все.


olga802005

up


olga802005

Уважаемая olga802005!До тех пор пока в таблицах не будет даты совершения операции, какое-либо приемлемое решение не возникнет. Это ведь не ексель, где можно визуально определять требуемые строки, это реляционная БД (не пугайтесь). Я бы добавил еще таблицу "Протирка"
idЗапчасти
А из таблиц Запчасти и Комплектация удалить поля SpirtТехЭкс, SpirtПищЭкс. Или превратить эти поля в нормативы - сколько требуется спирта для данной детали/запчасти.Все данные по протиркам записывать в т.Протирка. И тогда запросами определить кто, когда и сколько не составит труда.Но по сегодняшней схеме данных сделать это весьма проблематично.


olga802005

Уважаемая olga802005!До тех пор пока в таблицах не будет даты совершения операции, какое-либо приемлемое решение не возникнет. Это ведь не ексель, где можно визуально определять требуемые строки, это реляционная БД (не пугайтесь). Я бы добавил еще таблицу "Протирка"А из таблиц Запчасти и Комплектация удалить поля SpirtТехЭкс, SpirtПищЭкс. Или превратить эти поля в нормативы - сколько требуется спирта для данной детали/запчасти.Все данные по протиркам записывать в т.Протирка. И тогда запросами определить кто, когда и сколько не составит труда.Но по сегодняшней схеме данных сделать это весьма проблематично.
вот создала пустую таблицу "Списание спирта"
idЗапчасти
поля SpirtТехЭкс, SpirtПищЭкс так и оставила в таблицах "Запчасти" и "Комплектация" как затраченный на них спирт. (т.е. как пришло изделие, то сразу в паспорте к нему указано кол-во спирта пришедшего с ним)вот как теперь мне получить список любых изделий, у которых имеется заполненное поле SpirtТехЭкс и их сумма укладывалась бы в 5 литров. И этот список бы получался новый при повторных запросах?


olga802005

up