Вход | Регистрация
 

Еще один глупый вопрос по запросам (расчет процентов)

Еще один глупый вопрос по запросам (расчет процентов)
Я
   alxbzm
 
14.04.09 - 16:21
Думаю, вопрос не оригинален, но тем не менее:

имеем запрос пусть, для примера, по регистру ПартииТоваров (УТ 10.3), ну допустим, такой:

ВЫБРАТЬ
   ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
   ПартииТоваровНаСкладахОстаткиИОбороты.Склад КАК Склад,
   СУММА(ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоРасход) КАК КоличествоРасход,
   СУММА(ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток
ИЗ
   РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(&Дата1, &Дата2, Период, , ) КАК ПартииТоваровНаСкладахОстаткиИОбороты

СГРУППИРОВАТЬ ПО
   ПартииТоваровНаСкладахОстаткиИОбороты.Склад,
   ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура
ИТОГИ
   СУММА(КоличествоРасход),
   СУММА(КоличествоКонечныйОстаток)
ПО
   Склад,
   Номенклатура


так вот я хочу посчитать некий процент по группировкам, пусть процент будет равен (КоличествоРасход / КоличествоКонечныйОстаток).

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

Возможно ли в запросе подсчет процентов как отношение итогов на каждом уровне группировки а не как сумма всех подчиненных? Если можно, то на примере данного запроса объясните пожалуйста.
   IronDemon
 
1 - 14.04.09 - 16:23
ИТОГИ
    СУММА(КоличествоРасход),
    СУММА(КоличествоКонечныйОстаток),
    Сумма(КоличествоРасход)/Сумма(КоличествоКонечныйОстаток)
   alxbzm
 
2 - 15.04.09 - 13:18
(1) - отлично - сработало - спасибо! Вот только запрос надо на самом деле переписать вот так:

ВЫБРАТЬ
    ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
    ПартииТоваровНаСкладахОстаткиИОбороты.Склад КАК Склад,
    СУММА(ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоРасход) КАК КоличествоРасход,
    СУММА(ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток,
    СУММА(0) КАК Процент
ИЗ
    РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(&Дата1, &Дата2, Период, , ) КАК ПартииТоваровНаСкладахОстаткиИОбороты

СГРУППИРОВАТЬ ПО
    ПартииТоваровНаСкладахОстаткиИОбороты.Склад,
    ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура
ИТОГИ
    СУММА(КоличествоРасход),
    СУММА(КоличествоКонечныйОстаток),
    СУММА(КоличествоРасход) / СУММА(КоличествоКонечныйОстаток) КАК Процент
ПО
    Склад,
    Номенклатура

А теперь вопрос для знатоков - как все это запихать в построитель так, чтобы он отбирал по значению процента не на уровне номенклатуры а на уровне склада???? По-моему никак, но может все-таки есть варианты?
   IronDemon
 
3 - 15.04.09 - 13:20
- Разные поля для группировок
  - СКД
   alxbzm
 
4 - 15.04.09 - 13:25
(3) про разные поля для группировок можно поподробнее пожалуйста.... пока не соображу как.
   IronDemon
 
5 - 15.04.09 - 13:32
Расчет итогов только для уже полученных группировок
Для того, чтобы значение некоторых суммируемых полей рассчитывалось только для группировок, по которым уже получены итоги, в выражении для расчета итога можно воспользоваться тем фактом, что значение полей - группировок для еще не полученных группировок равняется NULL.

Пример:

ВЫБРАТЬ
    ОсновнойОстатки.Счет КАК Счет,
    ОсновнойОстатки.Валюта КАК Валюта,
    ОсновнойОстатки.СуммаОстаток КАК СуммаОстаток,
    ОсновнойОстатки.ВалютнаяСуммаОстаток КАК ВалютнаяСуммаОстаток
ИЗ
    РегистрБухгалтерии.Основной.Остатки КАК ОсновнойОстатки
ИТОГИ
    СУММА(СуммаОстаток),
    ВЫБОР
        КОГДА Валюта ЕСТЬ НЕ NULL 
            ТОГДА СУММА(ВалютнаяСуммаОстаток)
    КОНЕЦ КАК ВалютнаяСуммаОстаток
ПО
    Счет,
    Валюта

В данном примере значение итога для поля "ВалютнаяСуммаОстаток" будет рассчитано только для итоговых записей, в которых уже получена группировка Валюта. Т.е. в итоговых записях для группировки Счет итоги по полю "ВалютнаяСуммаОстаток" будут рассчитывать только тогда, когда итоги по данной группировке будут получаться только внутри группировки Валюта.

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

Пример:

ВЫБРАТЬ
    ОсновнойОстатки.Счет КАК Счет,
    ОсновнойОстатки.Валюта КАК Валюта,
    ОсновнойОстатки.СуммаОстаток КАК СуммаОстаток,
    ОсновнойОстатки.ВалютнаяСуммаОстаток КАК ВалютнаяСуммаОстаток
ИЗ
    РегистрБухгалтерии.Основной.Остатки КАК ОсновнойОстатки
ИТОГИ
    СУММА(СуммаОстаток),
    ВЫБОР
        КОГДА КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Валюта) = 1
            ТОГДА СУММА(ВалютнаяСуммаОстаток)
    КОНЕЦ КАК ВалютнаяСуммаОстаток
ПО
    Счет,
    Валюта

В данном примере рассчет итого по полю "ВалютнаяСуммаОстаток" будет производиться только для тех итоговых записей, которые содержат лишь одно значение поля "Валюта".
   alxbzm
 
6 - 15.04.09 - 13:45
(5) о как! - спасибо огромное за подробный ответ!!!! - идею уловил - буду разбираться.
   alxbzm
 
7 - 15.04.09 - 14:40
(5) я извиняюсь за наглость - как посчитать итоги только на определенных уровнях я разобрался - еще раз спасибо - очень полезная информация!!!

Но как теперь отфильтровать весь результат запроса по этим итогам без использования вложенных запросов?

Ведь насколько я понял, отбор в запросе осуществляется на уровне детальных записей без проверки каких-либо условий по вышестоящим группировкам.

Т.е. если описать словами пример из (2) я хочу, чтобы в запросе у меня получились только склады, по которым, например, Процент > 0.5. Это возможно в самом запросе без вложенных запросов и фильтрации на уровне выборки?
   IronDemon
 
8 - 15.04.09 - 14:42
ПроцентСклады, ПроцентТовар
   alxbzm
 
9 - 15.04.09 - 14:54
(8) торможу ))))) - не работает отбор - отбирает только по проценту на уровне детальной записи склад + номенклатура.

помогите убогому ))))) вот переделанный запрос (убрал проверку деления на ноль для большей наглядности) - тут подсчет процента только на уровне склада добавлен. как условие правильно написать?

ВЫБРАТЬ
    ПартииТоваровНаСкладахОстаткиИОбороты.Склад КАК Склад,
    ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
    СУММА(ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоРасход) КАК КоличествоРасход,
    СУММА(ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток,
    СУММА(ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоРасход / ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток) КАК Процент
ИЗ
    РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(
            &Дата1,
            &Дата2,
            Период,
           ,
            Номенклатура В ИЕРАРХИИ (&Номенклатура)
                И Склад В (&Склад)) КАК ПартииТоваровНаСкладахОстаткиИОбороты

СГРУППИРОВАТЬ ПО
    ПартииТоваровНаСкладахОстаткиИОбороты.Склад,
    ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура
ИТОГИ
    СУММА(КоличествоРасход),
    СУММА(КоличествоКонечныйОстаток),
    ВЫБОР
        КОГДА Номенклатура ЕСТЬ NULL 
            ТОГДА СУММА(КоличествоРасход) / СУММА(КоличествоКонечныйОстаток)
        ИНАЧЕ 0
    КОНЕЦ КАК Процент
ПО
    Склад,
    Номенклатура
   alxbzm
 
10 - 15.04.09 - 14:56
Если вставить в этот запрос 

ГДЕ
    ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоРасход / ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток > 0.5

То отбираются записи где на уровне детальной записи > 0.5 а не на уровне склада
   73
 
11 - 15.04.09 - 14:59
Имеющие
   alxbzm
 
12 - 15.04.09 - 15:27
(11) Согласен - исправился, но добавка 

ВЫБОР
        КОГДА Номенклатура ЕСТЬ NULL 
            ТОГДА СУММА(КоличествоРасход) / СУММА(КоличествоКонечныйОстаток)
        ИНАЧЕ 0
КОНЕЦ > 0.5
вообще пустоту выдает...
   alxbzm
 
13 - 15.04.09 - 15:29
(12) блин, вот так добавил

ИМЕЮЩИЕ
ВЫБОР
        КОГДА Номенклатура ЕСТЬ NULL 
            ТОГДА СУММА(КоличествоРасход) / СУММА(КоличествоКонечныйОстаток)
        ИНАЧЕ 0
КОНЕЦ > 0.5
   alxbzm
 
14 - 15.04.09 - 15:30
(13) ну в общем вообще ни одной записи в запросе в результате
   alxbzm
 
15 - 15.04.09 - 15:34
(14) - ага - отвечаю сам себе - это условие означает наличие в исходнике Номенклатура = NULL, а не в группировках.... Вопрос все-таки остается открытым - как наложить условие на значение итога?
   73
 
16 - 15.04.09 - 15:51
Может так:
ИМЕЮЩИЕ
СУММА(КоличествоРасход) / СУММА(КоличествоКонечныйОстаток) > 0.5
   alxbzm
 
17 - 15.04.09 - 15:54
(16) пробовал - в этом случае в результат попадают записи, где на уровне Склад-Номенклатура > 0.5, т.е. по уровню детальных записей отбирает.
   73
 
18 - 15.04.09 - 16:15
Типа так:

ВЫБРАТЬ
    ПартииТоваровНаСкладахОстаткиИОбороты.Склад КАК Склад,
    ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
    СУММА(ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоРасход) КАК КоличествоРасход,
    СУММА(ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток,
    СУММА(ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоРасход / ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток) КАК Процент
ИЗ
    РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(
            &Дата1,
            &Дата2,
            Период,
            ,
            Номенклатура В ИЕРАРХИИ (&Номенклатура)
                И Склад В (ВЫБРАТЬ Склад Из (    Выбрать
                        Партии.Склад КАК Склад,
                        Партии.Номенклатура КАК Номенклатура,
                        СУММА(Партии.КоличествоРасход) КАК КоличествоРасход,
                        СУММА(Партии.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток,
                        СУММА(Партии.КоличествоРасход / Партии.КоличествоКонечныйОстаток) КАК Процент
                    ИЗ
                        РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(
                                &Дата1,
                                &Дата2,
                                Период,
                               ,
                                Номенклатура В ИЕРАРХИИ (&Номенклатура)
                                И Склад В (&Склад)) КАК Партии

                    СГРУППИРОВАТЬ ПО
                        Партии.Склад
                    ИМЕЮЩИЕ СУММА(КоличествоРасход) / СУММА(КоличествоКонечныйОстаток) > 0.5

                    ))) КАК ПартииТоваровНаСкладахОстаткиИОбороты

ИТОГИ
    СУММА(КоличествоРасход),
    СУММА(КоличествоКонечныйОстаток),
    ВЫБОР
        КОГДА Номенклатура ЕСТЬ NULL 
            ТОГДА СУММА(КоличествоРасход) / СУММА(КоличествоКонечныйОстаток)
        ИНАЧЕ 0
    КОНЕЦ КАК Процент
ПО
    Склад,
    Номенклатура

Можно еще временную таблицу и пакеты попробовать, чтобы быстрее работало.
   alxbzm
 
19 - 15.04.09 - 16:31
(18) да, так сработало... я просто думал, что можно изящнее - но в конце концов нужный результат мы добились. спасибо!

Список тем форума
Рекламное место пустует  Рекламное место пустует
Прочитай, хотя бы, Митичкина "Разработка в системе 1С:Предприятие 8". Волшебник
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.