|   |   | 
| 
 | Разминка для ума: сумма процентов в запросе | ☑ | ||
|---|---|---|---|---|
| 0
    
        jcage 23.10.11✎ 14:36 | 
        Имеем:
  (Выбрать 10 как процент объединить все выбрать 20 объединить все выбрать 30) задача: посчитать в запросе коэффициент, на который надо умножить исходное число, что получить эффект, как от добавления всех процентов запроса к этому числу. для приведенного примера коэффицент будет: (1 + 10/100) * (1 + 20/100) * (1 + 30/100) = 1,716 вопрос, как такую чтуку провернуть в запросе? число, к которому будет применен коэффициент заранее не известно p.s. выгрузить в таблицу и посчитать я и сам могу, интересно, можно ли такую штуку в запрос затолкать =) | |||
| 1
    
        el-gamberro 23.10.11✎ 14:40 | 
        число строк в таблице процентов заранее неизвестно?     | |||
| 2
    
        jcage 23.10.11✎ 14:43 | 
        (1) не-а. 2 таблицы, в первой из которых значение, во второй несколько строк с процентами.     | |||
| 3
    
        el-gamberro 23.10.11✎ 14:57 | 
        (2) несколько это сколько?
  если делать нечего можно тупо транспортировать таблицу и перемножить все ее поля. | |||
| 4
    
        Новиков 23.10.11✎ 15:31 | 
        ВЫБРАТЬ
  Зап.процент, Зап.Коэф ПОМЕСТИТЬ Темп ИЗ (ВЫБРАТЬ 10 КАК процент, 1 + 10 / 100 КАК Коэф ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 20, 1 + 20 / 100 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 30, 1 + 30 / 100) КАК Зап ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СУММА(ВЫБОР КОГДА Темп.процент = 10 ТОГДА Темп.Коэф ИНАЧЕ 0 КОНЕЦ) * СУММА(ВЫБОР КОГДА Темп.процент = 20 ТОГДА Темп.Коэф ИНАЧЕ 0 КОНЕЦ) * СУММА(ВЫБОР КОГДА Темп.процент = 30 ТОГДА Темп.Коэф ИНАЧЕ 0 КОНЕЦ) КАК Коэффициент ИЗ Темп КАК Темп | |||
| 5
    
        МихаилМ 23.10.11✎ 15:37 | 
        совместное уравнение можно решить запросом.     | |||
| 6
    
        el-gamberro 23.10.11✎ 16:58 | 
        (4) насколько я понял нужно получить произведение :)
  например можно переменожить 1000 колонок, в пустых должна быть 1. задача только транспортировать строки в столбцы, в пустые столбцы 1. если есть разумное максимально возможное число строк, то ничего в этом сложного. :) | |||
| 7
    
        Новиков 23.10.11✎ 17:48 | 
        (6) скопируй запрос (4) в консоль и увидишь в результате одну строку с одним полем, в котором и будет требуемое произведение :) Если я правильно понял твое непонимание )))
  Кстати, аналогично можно было результата и вот так: ВЫБРАТЬ Зап.процент, Зап.Коэф ПОМЕСТИТЬ Темп ИЗ (ВЫБРАТЬ 10 КАК процент, 1 + 10 / 100 КАК Коэф ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 20, 1 + 20 / 100 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 30, 1 + 30 / 100) КАК Зап ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МАКСИМУМ(ВЫБОР КОГДА Темп.процент = 10 ТОГДА Темп.Коэф ИНАЧЕ NULL КОНЕЦ) * МАКСИМУМ(ВЫБОР КОГДА Темп.процент = 20 ТОГДА Темп.Коэф ИНАЧЕ NULL КОНЕЦ) * МАКСИМУМ(ВЫБОР КОГДА Темп.процент = 30 ТОГДА Темп.Коэф ИНАЧЕ NULL КОНЕЦ) КАК Поле1 ИЗ Темп КАК Темп Повнимательнее почитав (2) (2 таблицы, в первой из которых значение, во второй несколько строк с процентами) мне кажется, что автор хотел все таки, не то, что он описал в (0). Спасет автора ранжирование уникальных пар значение-процент + запросы, которые я уже привел с небольшой модификацией. Но с учетом реализации языка запроса в 1С, задача вроде бьется на: 1. само ранжирование 2. транспонирование результирующей выборки. Если проценты как-то там кратны предположим 10, 5 или как-то еще - через конкатенацию можно получить нужный запрос. Если нет и количество различных процентов велико, то (видимо) смысла получать все это в запросе уже нет никакого. К Владу Кадони ходить не нужно будет, чтобы понять - что проще все сделать через тупое ТЗ. В любом случае - автору - удачи! | |||
| 8
    
        ILM гуру 23.10.11✎ 19:06 | 
        (0) Я так понял, что автор решает проблему расчета цены или другого свойства по различным свойствам товара? 
  Как вариант решать задачу "запросом в цикле ))". Цикл по строкам выборки "процентов", передавать параметром в другой запрос "процент" и далее перемножать результат "Темп" сам на себя. | |||
| 9
    
        jcage 23.10.11✎ 19:12 | 
        (3) транспортация нарушает условие не кодирования )) идея именно в том, что бы все в запрос затолкать. не хочется прерывать цикл пакетных запросов, вручную обрабатывать и опять заталкивать в пакет )
  (4) Не получиться, т.к. я не знаю, сколько строк в таблице. то что ты написал реализуемо, если запрос собирать динамически в коде. из предыдущего обзаца понятно, что я как раз хочу избежать предварительной обработки всех строк, по которым надо посчитать произведение. (8) уважаемый, заранее извини, если тебе покажется что я грублю. но, знающие меня люди понимают, что я спрашиваю не задачу ламерского уровня. поэтому прошу твои догадки оставить при себе. конкретно в моем случае есть тур с базовыми ценами, к которому бывает около 10-20 спецпредложений как в процентах, так и в фиксированных скидках и доплатах с различными условиями и условиями на комбинацию этих самых спецпредложений. т.к. мой запрос расчета стоимости занимает 4 экрана, то я не хочу посередине запроса выгружать результат в ТЗ, обрабатывать ее и окончательно досчитывать запросом. соответственно мне нужно решить задачу, приведнную в (0). это чисто программерско-философский вопрос и не имеет вопроса к конкретной реализации, идею которой привел ты - у меня и так все прекрасно работает с промежуточной обработкой. Если есть идеи по поводу (0) прошу высказываться :-) | |||
| 10
    
        ILM гуру 23.10.11✎ 19:29 | 
        (9) Грубо не кажется, пытаюсь помочь.
  Если точно так как в описано в (0), то запросом в 1С это невозможно. В Оракл, это делается созданием собственной агрегатной функции МНОЖСУММА(): перемножающей суммированные значения в запросе. У Вас два пути: 1) все возможные варианты записать в запрос, не разрешая потом добавлять новые алгоритмы расчета 2) создать гибкий алгоритм, но уже без запроса. | |||
| 11
    
        Новиков 23.10.11✎ 19:33 | 
        (9) >>из предыдущего обзаца понятно, что я как раз хочу избежать предварительной обработки всех строк, по которым надо посчитать произведение.
  В рамках языка запросов 1С твой философский вопрос ответ имеет печальный: НИКАК то что ты хочешь там не сделать. | |||
| 12
    
        Ненавижу 1С гуру 23.10.11✎ 19:56 | 
        помещать не проценты, а логарифмы коэффициентов, суммировать в результате запросе, брать потом экспоненту     | |||
| 13
    
        ILM гуру 23.10.11✎ 20:07 | 
        (12) Круто))) 
  Я сначала про ряды Фурье подумал, может нужно Пи поделить. | |||
| 14
    
        Ненавижу 1С гуру 23.10.11✎ 20:08 | 
        (13) это такой стёб?     | |||
| 15
    
        ILM гуру 23.10.11✎ 20:21 | 
        (14) Ну чуть-чуть))) Хотя про ряды Фурье чистая правда: 1/2 + 1/3 + 1/4 и т.д. А потом уже увидел что умножать нужно.     | |||
| 16
    
        el-gamberro 23.10.11✎ 20:37 | 
        (9) затолкай транспорирование в запрос. какие проблемы?     | |||
| 17
    
        jcage 23.10.11✎ 21:20 | 
        (16) поподробнее пжл) не умею я такого штатными средстами)     | |||
| 18
    
        Lama12 23.10.11✎ 21:52 | 
        (0)А может лучше без запроса?
  Про точность в запросах слышал? Точность вычислений устроит? | |||
| 19
    
        jcage 23.10.11✎ 22:14 | 
        (18) без запроса уже работает. вопрос философский.. точность устраивает.. по поводу научить меня ньансам читай (9) в разделе к ответу (8)     | |||
| 20
    
        el-gamberro 24.10.11✎ 13:56 | 
        (17)
  row_id value 1 20 2 10 3 30 ВЫБРАТЬ ВЫБОР КОГДА роу_ид = 1 ТОГДА value ИНАЧЕ 100 КОНЕЦ КАК ПерваяКолонка, .... ВЫБОР КОГДА роу_ид = 100 ТОГДА value ИНАЧЕ 100 КОНЕЦ КАК СотаяКолонка | |||
| 21
    
        el-gamberro 24.10.11✎ 13:58 | 
        +(20) Точнее там 0 должен быть. а чтобы свернуть таблицу использовать сумму     | |||
| 22
    
        jcage 24.10.11✎ 18:16 | 
        (20) опять же это не для неограниченного числа строк.
  я решил задачу, но с ограничением точности. Жду пока кто-то придумает лучше))) x1 = первый процент в тз, заведомо меньше 1-цы, т.к. уже разделен на 100. Допустим 0.1 x2 = второй процент в тз, заведомо меньше 1-цы, т.к. уже разделен на 100. Допустим 0.2 ... xN = n-ый процент в тз, заведомо меньше 1-цы, т.к. уже разделен на 100. Допустим 0.n коэффициент в первой строке, умножив на которое неизвестное получим искомую сумму с процентами (1 + x1), во второй (1 + x2) и т.д. (1+x1)(1+x2) = 1 + x1 + x2 + x1x2; (1+x1)(1+x2)(1+x3) = 1 + x1 + x2 + x3 + x1x2 + x2x3 + x1x3 + x1x2x3; очевидно, что есть постоянная часть 1, СУММА(X), а также СУММА(Табл1.Процент*Табл2.Процент), при соединении таблиц по Табл1.НомерСтроки < Табл2.НомерСтроки так же очевидно, что x1*x2...*xn стремиться к нулю, т.к. x < 1. Таким образом выбрав соединение 4-ех таблиц по описанным принципам можно добиться точности вполне достаточной для работы с денежными показателями до 10 000 рублей. Что в моем случае вполне приемлимо. можно соединять 17 таблиц - получиться точность, удовлетворяющая принятый в 1С тип для денег (15,2). решение не идеальное, но вполне математически доказанное. кто лучше? ;) | |||
| 23
    
        ILM гуру 25.10.11✎ 20:15 | 
        (22) Кстати полезная штука, я сейчас по ТОС что-то подобное считаю с вероятностями отклонений от статистической устойчивости процесса, для оценки выполнимости бюджетов и планов.
  Но оставил пока запросы в цикле. Кстати нужно вышку вспомнить по пределам, там интеграл наверное будет... за 2о лет уже многое забылось, нужно полистать Выгодского... | |||
| 24
    
        Rovan гуру 25.10.11✎ 20:43 | 
        (0) а так нельзя ?
  ((10/100) + (20/100) + (30/100)) / 3 = 0.2 | |||
| 25
    
        jcage 27.10.11✎ 09:55 | 
        (24) x * (1 + 10/100) * (1 + 20/100) * (1 + 30/100) = 1,716 * x
  нельзя. | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |