Стандартная задача через запрос | |
---|---|
boba Автор Сообщений: 6269 Откуда: Медвежьи озера- Дата регистрации: 26.03.2001 |
Есть в бух задачах такая, несколько записей, в которых есть суммы
Суммы деляться нацелое число и округляются функцией round до копеек В последнюю строку к такой сумме нужно приплюсовать остаток копеек от общей суммы за вычетом округленных суммы Такую или похожую задачу делал многократно, но последнюю операцию всегда делал через цикл Сейчас захотел только операторами sql select, update и ничо написать не красивого написать не смог Те вопрос не в том, чтобы выполнить задачу, а выполнить определенным образом Пример, есть 2 таблицы с общим ключом в отношении много ко много Те запрос дает n* m записей В первой таблице есть поле суммы В запросе сумма должна быть заменена на round(summ/m, 2) m- число записей во втророй таблице без поля сумма Теперь к последней записи запроса нужно прибавить sum(summ)- sum(round(summ/m, 2)) Никак не могу получить простой и красивый код, все, что получается, громоздко и некрасиво, хотя правильно работает Ну, например, в первой таблице видим с одним значением общего ключа такие суммы 203 301 427 А во второй таблице с тем же ключом есть пара записей Вместо 3 записей в запросе видим 6 , где сумма удвоится Значит поделим ее на 2 и округлим до копеек Общая сумма уже не равна исходной, разницу нужно добавить к последней строчке round(427/2,2) , но только к ней, а не такой же строчки выше Исправлено 1 раз(а). Последнее : boba, 05.09.12 21:50 |
Re: Стандартная задача через запрос | |
---|---|
LUCIAN Сообщений: 343 Откуда: Лида Беларусь Дата регистрации: 25.03.2008 |
Похожую задачу расчитать калькуляцию себестоимости продукции за месяц я сделал так
|
Re: Стандартная задача через запрос | |
---|---|
sphinx Сообщений: 31184 Откуда: Каменск-Уральски Дата регистрации: 22.11.2006 |
LUCIAN, Владимир писал:
Цитата: На Оракле, думаю, можно. Там классные выборки с промежуточными и общими итогами можно одним запросом делать! ------------------ "Veni, vidi, vici!"(с) |
Re: Стандартная задача через запрос | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
А где же скриптик на создание и заполнение тестовых таблиц? Без этого влом рисовать, т.к. не понятна до конца связь между первой и второй таблицами.
------------------ WBR, Igor |
Re: Стандартная задача через запрос | |
---|---|
Влад Колосов Сообщений: 22664 Откуда: Ростов-на-Дону Дата регистрации: 05.05.2005 |
Надо сначала суммировать а затем джойнить.
------------------ Совершенство - это не тогда, когда нельзя ничего прибавить, а тогда, когда нечего убавить. |
Re: Стандартная задача через запрос | |
---|---|
Владимир Максимов Сообщений: 14100 Откуда: Москва Дата регистрации: 02.09.2000 |
Если я правильно понял, то задача выглядит так
Проблема в том, что если сложить полученные суммы по строкам, то они не совпадут с исходными суммами. Необходимо внести коррекцию, которую добавить к последней строке каждой суммы Например, для суммы 427 получили две суммы по 214. Вместе это 214+214=428. Необходимо скорректировать на 1 значение в последней строке с LineNum = 2 чтобы по строкам получилосьь 214+213 = 427. |
Re: Стандартная задача через запрос | |
---|---|
boba Автор Сообщений: 6269 Откуда: Медвежьи озера- Дата регистрации: 26.03.2001 |
Ты как в воду глядел
Из-за Оракл и стараюсь Если в Фоксе разницы сумм хоть криво, но можно поправить в цикле, то на Оракл все это хотелось бы пробить только запросной технологией Под некрасивым кодом я как раз имел в виду всякие циклы Основной код с запросом коротенький, и коррекции суммы уже гораздо больше Некрасиво это Задача у бухов это типовая, во второй таблице без суммы часто лежат всякие весовые коэффициенты с общей суммой 1 Те суммы как-то нужно разбросать по статьям или чему-то другому ( счетам, остаткам, заказам итд) Так в Аверовской задаче Мультибухгалтерия я таких форм лет 9 назад переделал минимум штук 20. Все цело, доступно для воспроизведения сейчас Просто смотрю такие свои же коды и реально тошнит от дубовости. Сейчас просто пытаюсь просто понять, нет ли негромоздкого решения этой задачи А то ведь бывает, что разницу нужно поместить в первую строку или вообще создать доп строку с разницей ( валютная разница, например) Типовым решением видится код а ля класс-процедура Даем имена таблиц, ключей, полей сумм, весов, модификатор исправляемой строки с разницей сумм и все. |
Re: Стандартная задача через запрос | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
В оракле это всё одно будет PL/SQL процедурой - так что "циклы" никуда не денутся. А ещё и динамический SQL придётся использовать - ОСОБЕННО если хочется сделать это более-менее универсальным (хотя очень часто лишний "универсализм" есть большое зло).
------------------ WBR, Igor |
Re: Стандартная задача через запрос | |
---|---|
Влад Колосов Сообщений: 22664 Откуда: Ростов-на-Дону Дата регистрации: 05.05.2005 |
Не совсем понял... Задача состоит в расщеплении одной строки на несколько но так, чтобы суммы были верными? Для чего нужно это расщепление?
------------------ Совершенство - это не тогда, когда нельзя ничего прибавить, а тогда, когда нечего убавить. |
Re: Стандартная задача через запрос | |
---|---|
boba Автор Сообщений: 6269 Откуда: Медвежьи озера- Дата регистрации: 26.03.2001 |
Да куча есть таких задач в бухгалтерии
Разбить одну сумму с весовыми коэффицентами по разным статьям. Общая сумма измениться не должна, но представление суммы до копеек В бух задачах такого полно. Суммы в одной таблице, а веса разрезания во второй Причем несколько исходный сумм может иметь один общий ключ А цикл вовсе не обязателен, сейчас пытаюсь ввести динамический сурогатный ключ для одной группы ключей, проставляю его сам , определяю максимумы сурогатного ключа в каждой группе ключей, вычисляю разницу исходной суммы и суммы округленный и поделенных сумму и потом UPDATE суммы ПО ОСНОВНОМУ КЛЮЧУ И СУРОГАТНОМУ НО С УСЛОВИЕМ УЖЕ ОПРЕДЕЛЕННОГО МАКСИМУМА СУРОГАТНОГО КЛЮЧА ( те разница сумм падает на последнюю запись в группе ключей) Просто пока такой код у меня все еще выглядит громождко. |
Re: Стандартная задача через запрос | |
---|---|
LUCIAN Сообщений: 343 Откуда: Лида Беларусь Дата регистрации: 25.03.2008 |
На предприятии произведено N видов продукции.По каждому виду продукции известны затраты на зарплату,на материалы и т.д. Но есть общезаводские расходы такие как реклама,налоги,электроэнергия по которым величину расхода на каждый конкретный вид продукции определить невозможно.Поэтому при расчете себестоимости продукции расчитывают пропорционально какому то известному расходу. В моем примере это зарплата и материалы.Когда расчет делали вручную ,то считали соответствующие коэффициенты пропорциональности(веса),я решил обойтись без них и сделал так
|
Re: Стандартная задача через запрос | |
---|---|
Влад Колосов Сообщений: 22664 Откуда: Ростов-на-Дону Дата регистрации: 05.05.2005 |
В частном случае, например, так:
------------------ Совершенство - это не тогда, когда нельзя ничего прибавить, а тогда, когда нечего убавить. Исправлено 2 раз(а). Последнее : Влад Колосов, 08.09.12 12:48 |
Re: Стандартная задача через запрос | |
---|---|
LUCIAN Сообщений: 343 Откуда: Лида Беларусь Дата регистрации: 25.03.2008 |
|
Re: Стандартная задача через запрос | |
---|---|
LUCIAN Сообщений: 343 Откуда: Лида Беларусь Дата регистрации: 25.03.2008 |
Я ,как и Владимир хочу получить красивое решение. To Влад Колосов: в Вашем примере обе таблицы увязаны по id, в моей задаче таблицы такой увязки не имеют(R_IZD,R_ZAW). |
Re: Стандартная задача через запрос | |
---|---|
LUCIAN Сообщений: 343 Откуда: Лида Беларусь Дата регистрации: 25.03.2008 |
Вот ещё код для решения этой задачи(когда округления производятся до 1руб)
|
Re: Стандартная задача через запрос | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
Ну тут, смотря, что понимать под красотой. Например, одним запросом, согласен, было бы красиво. Если же что-то несколько иное, то опять же - возможны индивидуальные различия в понятиях подходящего варианта. Когда-то делал нечто подобное на FPD. И хотя, в моем понимании, вышло и не совсем красиво, как хотелось бы в идеале - но по-крайней мере без циклов, как в чужом параллельном варианте того же отчета, и весь код при этом помещался практически на одном экране - в отличие от того, разбросанного плюс ко всему еще и по многим процедурам, что всегда не особо приятно для отслеживания чего-либо при необходимости внесения изменений. Но зато ради всего этого пришлось во временных таблицах, создаваемых селектами, использовать дополнительные поля, между которыми и осуществлять переброску реплейсами, сумм получаемых с помощью аггрегатных суммирований по условиям. Т.е. все вышло в принципе линейно, т.е. без циклов, хотя и не совсем то, чего хотелось бы в идеале. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Стандартная задача через запрос | |
---|---|
LUCIAN Сообщений: 343 Откуда: Лида Беларусь Дата регистрации: 25.03.2008 |
Привожу код в виде одного SQL-запроса для БД оракла для решения задачи которая поставлена мною выше,окруление до 1 руб.
далее полученное отклонение CRAZN "поровну" распределим по всем строкам конечной таблицы. Для этого подсчитаем кол-во строк таблицы с помощью подзапроса (SELECT COUNT(*) KLZAP FROM CIZD) CCNT,далее делим отклонение на KLZAP и целую часть частного добавляем в каждую строку ,остаток от деления добавляем по 1 руб в 1-е mod() строк. |
Re: Стандартная задача через запрос | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Открой для себя оракловские CTE - т.е. конструкцию вида
------------------ WBR, Igor |
Re: Стандартная задача через запрос | |
---|---|
LUCIAN Сообщений: 343 Откуда: Лида Беларусь Дата регистрации: 25.03.2008 |
Вчера заглянул в этот топик и обнаружил,что на мое последнее сообщение есть замечание от Igor Korolyov благодаря ему ,я действительно для себя сделал открытие, и получил такое отлаженное решение для БД oracle
|
Re: Стандартная задача через запрос | |
---|---|
LUCIAN Сообщений: 343 Откуда: Лида Беларусь Дата регистрации: 25.03.2008 |
в отчёте о расходе материалов в р/р изделий бухгалтер заметила ,что сумма расхода ТМЦ не совпадает
с суммой по изделиям ( sum(si) <> sr group by nz) на одну две, копейки. Курсор для печати получен из БД Oracle.колонку si в этом курсоре подправил так:
но,так как в этом коде есть цикл ,то это не совсем "красивое" решение привожу более "красивое" решение в оракле,где SN вычисляется по правилу: рассчитывать нарастающий итог по текущей и предыдущей строке и вычислять округлённую разницу. Т. е. использовать не математическое округление,а округление, с учётом накопленного значения:
|
© 2000-2024 Fox Club  |