Имя: Пароль:
1C
1С v8
Распределение суммы в запросе (включая отклонение)
0 Бешеная Нога
 
23.07.14
12:17
Имеется таблица с базой для распределения.

ВЫБРАТЬ
    "Иванов" КАК Контрагент,
    3 КАК СуммаПродажи
ПОМЕСТИТЬ ТаблицаДляРаспределения

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Петров",
    3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Сидоров",
    3
;


Предложите оптимальный запрос для распределения определенной суммы на контрагентов в соответствии с базой распределения (включая копейки отклонения, например при распределении суммы 10 на предложенную базу)
1 mikecool
 
23.07.14
12:19
зачем именно запрос?
один проход циклом и все
2 piter3
 
23.07.14
12:19
в запросе?удачи
3 Бешеная Нога
 
23.07.14
12:19
(1) вся фишка именно в запросе
4 VRednaia
 
23.07.14
12:24
(0) Я делала так.
1я таблица - список того, что нужно распределять
2я таблица - база распределения
3я таблица - 1я распределенная по базе
4я таблица - 3я свернутая по столбцам первой
5я таблица - разница 4й и 1й (отклонения)
6я таблица - отклонения отнесенные на случайно выбранную строку 1й таблицы
7я таблица - объединение 3ей и 6й
5 mikecool
 
23.07.14
12:27
(3) имхо - рациональности в этом нет
6 Бешеная Нога
 
23.07.14
12:32
(4) Запрос который распределяет и получает сумму отклонения:

ВЫБРАТЬ
    "Иванов" КАК Контрагент,
    3 КАК СуммаПродажи
ПОМЕСТИТЬ ТаблицаДляРаспределения

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Петров",
    3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Сидоров",
    3
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СУММА(ТаблицаДляРаспределения.СуммаПродажи) КАК СуммаПродажиИтого,
    &СуммаРаспределения КАК СуммаРаспределения
ПОМЕСТИТЬ ТаблицаИтогов
ИЗ
    ТаблицаДляРаспределения КАК ТаблицаДляРаспределения
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Максимум(ТаблицаРаспределенияСОтклонениями.СуммаРаспределения) - СУММА(ТаблицаРаспределенияСОтклонениями.СуммаРаспределенная) КАК СуммаОтклонения
ИЗ
    ТаблицаРаспределенияСОтклонениями КАК ТаблицаРаспределенияСОтклонениями
7 Бешеная Нога
 
23.07.14
12:33
а вот как потом правильно и красиво включить сумму отклонения на максимульную распределенную сумму?
8 Timon1405
 
23.07.14
12:37
(5) Иногда действительно "так нужно". Например, в УПП в документе УчетФактическихДанныхПоБюджетам берется текст запрос а из справочника, пихается в построитель, там все считается. Тут прописывать постобработку для отдельных статей как-то не комильфо.
9 mikecool
 
23.07.14
12:38
(7) выбрать максимум суммы и по нему отбирать
10 VRednaia
 
23.07.14
12:39
ВЫБРАТЬ
    "Иванов" КАК Контрагент,
    3 КАК СуммаПродажи
ПОМЕСТИТЬ ТаблицаДляРаспределения

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Петров",
    3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Сидоров",
    3
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СУММА(ТаблицаДляРаспределения.СуммаПродажи) КАК СуммаПродажиИтого,
    &СуммаРаспределения КАК СуммаРаспределения
ПОМЕСТИТЬ ТаблицаИтогов
ИЗ
    ТаблицаДляРаспределения КАК ТаблицаДляРаспределения
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТаблицаДляРаспределения.Контрагент КАК Контрагент,
    ТаблицаДляРаспределения.СуммаПродажи КАК СуммаПродажи,
    ТаблицаИтогов.СуммаПродажиИтого КАК СуммаПродажиИтого,
    ТаблицаИтогов.СуммаРаспределения КАК СуммаРаспределения,
    ВЫРАЗИТЬ(ТаблицаДляРаспределения.СуммаПродажи / ТаблицаИтогов.СуммаПродажиИтого * ТаблицаИтогов.СуммаРаспределения КАК ЧИСЛО(15, 2)) КАК СуммаРаспределенная
ПОМЕСТИТЬ ТаблицаРаспределенияСОтклонениями
ИЗ
    ТаблицаДляРаспределения КАК ТаблицаДляРаспределения
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаИтогов КАК ТаблицаИтогов
        ПО (ИСТИНА)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МАКСИМУМ(ТаблицаРаспределенияСОтклонениями.СуммаРаспределения) - СУММА(ТаблицаРаспределенияСОтклонениями.СуммаРаспределенная) КАК СуммаОтклонения
ПОМЕСТИТЬ ВТ_Отклонения
ИЗ
    ТаблицаРаспределенияСОтклонениями КАК ТаблицаРаспределенияСОтклонениями
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МАКСИМУМ(ТаблицаДляРаспределения.Контрагент) КАК Контрагент,
    МАКСИМУМ(ВТ_Отклонения.СуммаОтклонения) КАК СуммаОтклонения
ПОМЕСТИТЬ ВТ_РаспределенныеОтклонения
ИЗ
    ТаблицаДляРаспределения КАК ТаблицаДляРаспределения,
    ВТ_Отклонения КАК ВТ_Отклонения
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТаблицаРаспределенияСОтклонениями.Контрагент,
    ТаблицаРаспределенияСОтклонениями.СуммаПродажи,
    ТаблицаРаспределенияСОтклонениями.СуммаРаспределенная
ПОМЕСТИТЬ ВТ_Итоговая
ИЗ
    ТаблицаРаспределенияСОтклонениями КАК ТаблицаРаспределенияСОтклонениями

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ВТ_РаспределенныеОтклонения.Контрагент,
    NULL,
    СУММА(ВТ_РаспределенныеОтклонения.СуммаОтклонения)
ИЗ
    ВТ_РаспределенныеОтклонения КАК ВТ_РаспределенныеОтклонения

СГРУППИРОВАТЬ ПО
    ВТ_РаспределенныеОтклонения.Контрагент
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Итоговая.Контрагент,
    СУММА(ВТ_Итоговая.СуммаПродажи) КАК СуммаПродажи,
    СУММА(ВТ_Итоговая.СуммаРаспределенная) КАК СуммаРаспределенная
ИЗ
    ВТ_Итоговая КАК ВТ_Итоговая

СГРУППИРОВАТЬ ПО
    ВТ_Итоговая.Контрагент
11 Бешеная Нога
 
23.07.14
12:40
Есть такой вариант:

ВЫБРАТЬ
    "Иванов" КАК Контрагент,
    3 КАК СуммаПродажи
ПОМЕСТИТЬ ТаблицаДляРаспределения

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Петров",
    3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Сидоров",
    3
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СУММА(ТаблицаДляРаспределения.СуммаПродажи) КАК СуммаПродажиИтого,
    &СуммаРаспределения КАК СуммаРаспределения
ПОМЕСТИТЬ ТаблицаИтогов
ИЗ
    ТаблицаДляРаспределения КАК ТаблицаДляРаспределения
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТаблицаДляРаспределения.Контрагент КАК Контрагент,
    ТаблицаДляРаспределения.СуммаПродажи КАК СуммаПродажи,
    ТаблицаИтогов.СуммаПродажиИтого КАК СуммаПродажиИтого,
    ТаблицаИтогов.СуммаРаспределения КАК СуммаРаспределения,
    ВЫРАЗИТЬ(ТаблицаДляРаспределения.СуммаПродажи / ТаблицаИтогов.СуммаПродажиИтого * ТаблицаИтогов.СуммаРаспределения КАК ЧИСЛО(15, 2)) КАК СуммаРаспределенная
ПОМЕСТИТЬ ТаблицаРаспределенияСОтклонениями
ИЗ
    ТаблицаДляРаспределения КАК ТаблицаДляРаспределения
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаИтогов КАК ТаблицаИтогов
        ПО (ИСТИНА)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МАКСИМУМ(ТаблицаРаспределенияСОтклонениями.СуммаРаспределения) - СУММА(ТаблицаРаспределенияСОтклонениями.СуммаРаспределенная) КАК СуммаОтклонения
ПОМЕСТИТЬ ТаблицаОтклонения
ИЗ
    ТаблицаРаспределенияСОтклонениями КАК ТаблицаРаспределенияСОтклонениями
;

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

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

СГРУППИРОВАТЬ ПО
    ТаблицаМаксимальныхСуммИОтклонений.СуммаРаспределенная,
    ТаблицаМаксимальныхСуммИОтклонений.СуммаРаспределенная + ТаблицаМаксимальныхСуммИОтклонений.СуммаОтклонения
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТаблицаРаспределенияСОтклонениями.Контрагент КАК Контрагент,
    ТаблицаРаспределенияСОтклонениями.СуммаПродажи КАК СуммаПродажи,
    ТаблицаРаспределенияСОтклонениями.СуммаРаспределения КАК СуммаРаспределения,
    ВЫБОР
        КОГДА ТаблицаДляИзмененияРаспределения.Контрагент ЕСТЬ NULL
            ТОГДА ТаблицаРаспределенияСОтклонениями.СуммаРаспределенная
        ИНАЧЕ ТаблицаДляИзмененияРаспределения.НоваяСуммаРаспределения
    КОНЕЦ КАК СуммаРаспределенная
ИЗ
    ТаблицаРаспределенияСОтклонениями КАК ТаблицаРаспределенияСОтклонениями
        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаДляИзмененияРаспределения КАК ТаблицаДляИзмененияРаспределения
        ПО ТаблицаРаспределенияСОтклонениями.Контрагент = ТаблицаДляИзмененияРаспределения.Контрагент
            И ТаблицаРаспределенияСОтклонениями.СуммаРаспределенная = ТаблицаДляИзмененияРаспределения.СуммаРаспределенная


Но может можно как-то красивее?
12 VRednaia
 
23.07.14
12:44
(11) мне нравится
13 Бешеная Нога
 
23.07.14
12:48
(2) на счет удачи см (11)
14 Бешеная Нога
 
23.07.14
12:49
хочется перфекционизма...
15 piter3
 
23.07.14
12:50
(13)ужас.а так твое дело
16 Бешеная Нога
 
23.07.14
13:20
(1) и кстати "обход в цикле" - это для неудачников имхо
Основная теорема систематики: Новые системы плодят новые проблемы.