Имя: Пароль:
1C
1С v8
Условие в запросе
,
0 yalex
 
06.04.12
11:22
Коллеги, есть несложный запрос:

ВЫБРАТЬ
   Себестоимость.Номенклатура                                КАК Номенклатура,
   Продажи.СтоимостьОборот                                  КАК Оборот,
   Себестоимость.СтоимостьОборот - Продажи.СтоимостьОборот КАК Прибыль
ИЗ
   РегистрНакопления.ПродажиСебестоимость.Обороты(&ДатаНач, &ДатаКон, ) КАК Себестоимость
   ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
   РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон) КАК Продажи
   ПО Себестоимость.Номенклатура = Продажи.Номенклатура
УПОРЯДОЧИТЬ
   ПО Продажи.СтоимостьОборот УБЫВ

Мне нужно в порядке убывания оборота выбрать номеклатуры, сумма которых не больше 1000000. Подскажите возможно такое сделать с помощью запроса и как? Спасибо.
1 Maxus43
 
06.04.12
11:24
Где ТвояСумма <= 1000000
2 Maxus43
 
06.04.12
11:24
что не получается то?
3 yalex
 
06.04.12
11:26
(1) Не ну так бы я смог:) Мне по сути нужно ограничить выборку запроса: Выбрать первые номенклатуры, общая сумма оборотов которых не больше 1 млн
4 Maxus43
 
06.04.12
11:27
ну дак так и будет, если (1) вставиш... или я чото не понимаю?
5 Wobland
 
06.04.12
11:28
(3) для ограничить есть слово ГДЕ. что не устраивает?
6 Reset
 
06.04.12
11:31
Ему поди нужно набрать на нужную сумму
7 yalex
 
06.04.12
11:32
(4) Обороты номенклатур упорядочены по убыванию:

номенклатура1 - 600 000
номенклатура2 - 400 000
номенклатура3 - 100 000

номенклатра3 не попадёт в выборку ибо на ней превышается этот млн

Мне в запросе нуждно получить первые номенклатуры сумма оборотов которых не больше 1 млн
8 Maxus43
 
06.04.12
11:32
хм, да. в запросе имхо так не сделать
9 yalex
 
06.04.12
11:33
(8) вот и я только на чудо надеюсь)
10 ssh2006
 
06.04.12
11:35
Можно сделать
11 yalex
 
06.04.12
11:35
(10) Выручайте)
12 Maxus43
 
06.04.12
11:40
присоединяюсь. просветите грешных
13 Ненавижу 1С
 
гуру
06.04.12
11:42
соединить само с собой с условием неравенства на накапливаемую сумму
14 Maxus43
 
06.04.12
11:46
(13) пример есть?
15 Ненавижу 1С
 
гуру
06.04.12
11:46
рыба:

ВЫБРАТЬ
   Т1.Номенклатура КАК Номенклатура,
   Т1.СтоимостьОборот КАК СтоимостьОборот
   СУММА(Т2.СтоимостьОборот) КАК СтоимостьОборотНакопительная
ИЗ Т КАК Т1
ЛЕВОЕ СОЕДИНЕНИЕ Т КАК Т2
ПО (Т1.СтоимостьОборот<=Т2.СтоимостьОборот) // будут проблемы с одинаковыми показателями
СГРУППИРОВАТЬ ПО
   Т1.Номенклатура,
   Т1.СтоимостьОборот
ИМЕЮЩИЕ
   СУММА(Т2.СтоимостьОборот)<СтоТыщМиллионов
16 yalex
 
06.04.12
12:04
(15) Идея понятна. Буду пробовать..
17 ssh2006
 
06.04.12
14:20
ВЫБРАТЬ
   Продажи.СтоимостьОборот КАК Оборот,
   Продажи.СтоимостьОборот - Себестоимость.СтоимостьОборот КАК Прибыль,
   Продажи.Номенклатура
ПОМЕСТИТЬ Таб
ИЗ
   РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, , ) КАК Продажи
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПродажиСебестоимость.Обороты(&ДатаНач, &ДатаКон, , ) КАК Себестоимость
       ПО (Себестоимость.Номенклатура = Продажи.Номенклатура)
ГДЕ
   Продажи.СтоимостьОборот < &ОборотОграничение
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВложенныйЗапрос.Номенклатура,
   ВложенныйЗапрос.Оборот КАК Оборот,
   ВложенныйЗапрос.Прибыль,
   ВложенныйЗапрос.ОборотНакопление
ИЗ
   (ВЫБРАТЬ
       Таб.Номенклатура КАК Номенклатура,
       Таб.Оборот КАК Оборот,
       Таб.Прибыль КАК Прибыль,
       СУММА(ЕСТЬNULL(Таб1.Оборот, 0)) КАК ОборотНакопление,
       МИНИМУМ(ЕСТЬNULL(Таб1.Оборот, 0)) КАК МаксОборот
   ИЗ
       Таб КАК Таб
           ЛЕВОЕ СОЕДИНЕНИЕ Таб КАК Таб1
           ПО (ВЫБОР
                   КОГДА Таб.Оборот = Таб1.Оборот
                       ТОГДА Таб.Номенклатура < Таб1.Номенклатура
                   ИНАЧЕ Таб.Оборот < Таб1.Оборот
               КОНЕЦ)
   
   СГРУППИРОВАТЬ ПО
       Таб.Номенклатура,
       Таб.Оборот,
       Таб.Прибыль
   
   ИМЕЮЩИЕ
       СУММА(ЕСТЬNULL(Таб1.Оборот, 0)) < &ОборотОграничение - МИНИМУМ(ЕСТЬNULL(Таб1.Оборот, 0))) КАК ВложенныйЗапрос

УПОРЯДОЧИТЬ ПО
   Оборот УБЫВ
18 ssh2006
 
06.04.12
14:24
Причесано
ВЫБРАТЬ
   Продажи.СтоимостьОборот КАК Оборот,
   Продажи.СтоимостьОборот - Себестоимость.СтоимостьОборот КАК Прибыль,
   Продажи.Номенклатура
ПОМЕСТИТЬ Таб
ИЗ
   РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, , ) КАК Продажи
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПродажиСебестоимость.Обороты(&ДатаНач, &ДатаКон, , ) КАК Себестоимость
       ПО (Себестоимость.Номенклатура = Продажи.Номенклатура)
ГДЕ
   Продажи.СтоимостьОборот < &ОборотОграничение
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Таб.Номенклатура КАК Номенклатура,
   Таб.Оборот КАК Оборот,
   Таб.Прибыль КАК Прибыль,
   СУММА(ЕСТЬNULL(Таб1.Оборот, 0)) КАК ОборотНакопление
ИЗ
   Таб КАК Таб
       ЛЕВОЕ СОЕДИНЕНИЕ Таб КАК Таб1
       ПО (ВЫБОР
               КОГДА Таб.Оборот = Таб1.Оборот
                   ТОГДА Таб.Номенклатура < Таб1.Номенклатура
               ИНАЧЕ Таб.Оборот < Таб1.Оборот
           КОНЕЦ)

СГРУППИРОВАТЬ ПО
   Таб.Номенклатура,
   Таб.Оборот,
   Таб.Прибыль

ИМЕЮЩИЕ
   СУММА(ЕСТЬNULL(Таб1.Оборот, 0)) < &ОборотОграничение - МИНИМУМ(ЕСТЬNULL(Таб1.Оборот, 0))

УПОРЯДОЧИТЬ ПО
   Оборот УБЫВ
19 yalex
 
06.04.12
14:53
(18) Додумались же до такого) Спасибо!
20 ssh2006
 
06.04.12
15:48
(19) Только условие в (18) немного поправить надо. Вот так:
ИМЕЮЩИЕ
   СУММА(ЕСТЬNULL(Таб1.Оборот, 0)) + Таб.Оборот < &ОборотОграничение

Чтобы однозначно упорядочить записи для совпадающих оборотов сравниваются ссылки. А так как накопительная сумма не учитытывает значение оборота текущей записи, то к  накопленной сумме СУММА(ЕСТЬNULL(Таб1.Оборот, 0)) нужно прибавить текущее значение Таб.Оборот
21 yalex
 
06.04.12
16:00
(20) Да, я заметил. Спасибо вам большое!