Имя: Пароль:
1C
1С v8
запрос: вместо МАКСИМУМ выбирается СУММА
,
0 grayshadow
 
29.05.13
14:09
Задача - посчитать валовую прибыль по месяцам и из этого выбрать максимальное значение прибыли. Текст запроса:

ВЫБРАТЬ РАЗРЕШЕННЫЕ
   ПродажиОбороты.Контрагент,
   ПродажиОбороты.СтоимостьОборот КАК СтоимостьОборот,
   ПродажиОбороты.Период КАК Период
ПОМЕСТИТЬ ВТПродажиИСебестоимость
ИЗ
   РегистрНакопления.Продажи.Обороты(, , Месяц, ) КАК ПродажиОбороты

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

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

СГРУППИРОВАТЬ ПО
   ПродажиСебестоимостьОбороты.ЗаказПокупателя.Контрагент,
   ПродажиСебестоимостьОбороты.Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТПродажиИСебестоимость.Контрагент КАК Контрагент,
   СУММА(ВТПродажиИСебестоимость.СтоимостьОборот) КАК СтоимостьОборот,
   ВТПродажиИСебестоимость.Период КАК Период
ПОМЕСТИТЬ ВТПродССПоМес
ИЗ
   ВТПродажиИСебестоимость КАК ВТПродажиИСебестоимость

СГРУППИРОВАТЬ ПО
   ВТПродажиИСебестоимость.Контрагент,
   ВТПродажиИСебестоимость.Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТПродССПоМес.Контрагент КАК Контрагент,
   МАКСИМУМ(ВТПродССПоМес.СтоимостьОборот) КАК СтоимостьОборот
ИЗ
   ВТПродССПоМес КАК ВТПродССПоМес

СГРУППИРОВАТЬ ПО
   ВТПродССПоМес.Контрагент


вот результат предпоследнего запроса (ВТПродССПоМес) по одному из контрагентов:
01.11.2012 0:00:00    18 951.2
01.12.2012 0:00:00    75 252.2
01.01.2013 0:00:00    234 187.32
01.02.2013 0:00:00    36 883.3
01.03.2013 0:00:00    148 852.93
01.04.2013 0:00:00    252 189.17
01.05.2013 0:00:00    33 576.7

и последний запрос выбирает сумму этих цифр - 799 892.82
Ставила разные агрегатные функции - максимум, минимум, среднее, ВСЕ РАВНО всегда 799 892,82.
Что бы это значило? о_О
1 mikecool
 
29.05.13
14:11
у тебя в последнем запросе уже уникальные записи с просуммированными значениями, смотри предыдущий результат
2 Maxus43
 
29.05.13
14:12
да и в выборке контрагент, а не период как представлено
3 salvator
 
29.05.13
14:12
(0) Это не может быть результатом предпоследнего запроса. Где контрагент?
4 grayshadow
 
29.05.13
14:13
в предпоследней ВТ есть контрагент, я его убрала, потому что ето ж коммерческая тайна:)
5 grayshadow
 
29.05.13
14:14
оке, так:
ООО Рога и Копыта    01.11.2012 0:00:00    18 951.2
ООО Рога и Копыта    01.12.2012 0:00:00    75 252.2
ООО Рога и Копыта    01.01.2013 0:00:00    234 187.32
ООО Рога и Копыта    01.02.2013 0:00:00    36 883.3
ООО Рога и Копыта    01.03.2013 0:00:00    148 852.93
ООО Рога и Копыта    01.04.2013 0:00:00    252 189.17
ООО Рога и Копыта    01.05.2013 0:00:00    33 576.7
6 mikecool
 
29.05.13
14:14
смотри (1)
7 grayshadow
 
29.05.13
14:15
теперь мне надо получить
ООО Рога и Копыта    01.04.2013 0:00:00    252 189.17
а получается
ООО Рога и Копыта    01.04.2013 0:00:00    799 892.82
8 grayshadow
 
29.05.13
14:15
конечно, без периода:) сорри
9 mikecool
 
29.05.13
14:16
а, ну ладно , я не против, получай
10 salvator
 
29.05.13
14:17
Что написала, то и получила.
11 grayshadow
 
29.05.13
14:17
а почему вот это не работает:
МАКСИМУМ(ВТПродССПоМес.СтоимостьОборот) КАК СтоимостьОборот
?:)
12 Лефмихалыч
 
29.05.13
14:18
(7) потому, что 799892.82 - это оборот за какой-то месяц, какого-то года, но не 2013-го
13 salvator
 
29.05.13
14:18
Про группировки почитай.
14 mikecool
 
29.05.13
14:19
(11) потому что это какой то бесполезный налор букв
15 mikecool
 
29.05.13
14:19
набор*
16 Mitriy
 
29.05.13
14:19
потому что работает вот это:
СУММА(ВТПродажиИСебестоимость.СтоимостьОборот) КАК СтоимостьОборот
17 grayshadow
 
29.05.13
14:20
(7) я привела ВСЕ данные по ООО Рога и Копыта, в других месяцах по нему нет продаж
18 Лефмихалыч
 
29.05.13
14:22
Короче, последний запрос надо, как минимум вот так переписать:


ВЫБРАТЬ
   ВТПродССПоМес.Контрагент КАК Контрагент,
   МАКСИМУМ(ВТПродССПоМес.СтоимостьОборот) КАК СтоимостьОборот,
  НАЧАЛОПЕРИОДА(ВТПродССПоМес.Период, ГОД) КАК Год
ИЗ
   ВТПродССПоМес КАК ВТПродССПоМес

СГРУППИРОВАТЬ ПО
   ВТПродССПоМес.Контрагент,    НАЧАЛОПЕРИОДА(ВТПродССПоМес.Период, ГОД)



и всё зашибётся
19 Лефмихалыч
 
29.05.13
14:23
(17) если было бы так, максимум не возвращал бы овер 700000
20 Светлый Гений
 
29.05.13
14:26
(O) а нафига столько временных таблиц лепить? Не проще вложенный запрос сделать?
21 grayshadow
 
29.05.13
14:26
(18) мне не надо по годам, надо абсолютный максимум за всю историю:)
(19) обратите внимание, параметров ДатаНач и ДатаКон в вирт.таб нету, это данные за всю историю
22 Светлый Гений
 
29.05.13
14:28
(18)зачем?
23 grayshadow
 
29.05.13
14:29
(22) заказчег просит:)
это кусок большого отчета, в котором максимум используется для сравнения с текущими показателями
24 Светлый Гений
 
29.05.13
14:30
(23)это вопрос не к тебе был )
25 grayshadow
 
29.05.13
14:30
(18) можно конечно сгруппировать по ДобавитьКДате(Период,Год,-2000), но как-то это криво имхо:)
26 grayshadow
 
29.05.13
14:31
поняла, сбилась со счета постов:)
27 grayshadow
 
29.05.13
14:33
в общ мораль такая: в последнем запросе
МАКСИМУМ(ВТПродССПоМес.СтоимостьОборот) = 799 892.82
МИНИМУМ(ВТПродССПоМес.СтоимостьОборот) = 799 892.82
СРЕДНЕЕ(ВТПродССПоМес.СтоимостьОборот) = 799 892.82 тоже!:)
28 grayshadow
 
29.05.13
14:35
а количество и количество различных - 1:)))
29 Светлый Гений
 
29.05.13
14:37
(28) попробуй сделать без временных таблиц, вложенными запросами.
30 grayshadow
 
29.05.13
14:40
(28) помогло!
31 Лефмихалыч
 
29.05.13
14:41
(22) чтобы увидеть, что за 2013-й на самом деле максимум двести с хером и _узнать,_за_какой_именно год максимум составляет 700 с хером.
32 grayshadow
 
29.05.13
14:41
то есть (29)
спасибо!!
и таки это глюк платформы, ящитаю:)
33 grayshadow
 
29.05.13
14:42
вот так работает и возвращает максимум, а не хз что:
(вдруг кому пригодится в будущем)
ВЫБРАТЬ РАЗРЕШЕННЫЕ
   ПродажиОбороты.Контрагент,
   ПродажиОбороты.СтоимостьОборот КАК СтоимостьОборот,
   ПродажиОбороты.Период КАК Период
ПОМЕСТИТЬ ВТПродажиИСебестоимость
ИЗ
   РегистрНакопления.Продажи.Обороты(, , Месяц, ) КАК ПродажиОбороты

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

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

СГРУППИРОВАТЬ ПО
   ПродажиСебестоимостьОбороты.ЗаказПокупателя.Контрагент,
   ПродажиСебестоимостьОбороты.Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТПродССПоМес.Контрагент КАК Контрагент,
   максимум(ВТПродССПоМес.СтоимостьОборот) КАК СтоимостьОборот
ИЗ
   (
ВЫБРАТЬ
   ВТПродажиИСебестоимость.Контрагент КАК Контрагент,
   СУММА(ВТПродажиИСебестоимость.СтоимостьОборот) КАК СтоимостьОборот,
   ВТПродажиИСебестоимость.Период КАК Период
ИЗ
   ВТПродажиИСебестоимость КАК ВТПродажиИСебестоимость

СГРУППИРОВАТЬ ПО
   ВТПродажиИСебестоимость.Контрагент,
   ВТПродажиИСебестоимость.Период    
   ) КАК ВТПродССПоМес

СГРУППИРОВАТЬ ПО
   ВТПродССПоМес.Контрагент
34 salvator
 
29.05.13
14:43
И если уж делаешь вложенные таблицы, надо их удалять в конце.
35 salvator
 
29.05.13
14:43
*** временные таблицы
36 grayshadow
 
29.05.13
14:43
(34) так они сами помирают после окончания процедуры, в которой был запрос, не?
37 salvator
 
29.05.13
14:44
(36) Они умирают после завершения сессии пользователя.
38 grayshadow
 
29.05.13
14:45
хммм... почему тогда в ЗУП есть отчеты с 10-ком ВТ, и ни про одну не написано УНИЧТОЖИТЬ?:)
39 Галахад
 
гуру
29.05.13
14:49
Не, ну так не интересно.
Такая интрига, а оказывается результат предпоследнего запроса левый... :-(
40 grayshadow
 
29.05.13
14:52
не левый, все копировала:)
тупо перенесла из ВТ во вложенный запрос и заработало
41 Галахад
 
гуру
29.05.13
14:54
(40) Да ну, а условие на нулл?
42 grayshadow
 
29.05.13
14:56
оно не работает и ни на что не влияет:)
с ним и без него результат одинаковый
43 чеширский кот
 
29.05.13
14:56
месяц убери, он суммирует на период  РегистрНакопления.Продажи.Обороты(, , Месяц, ) КАК ПродажиОбороты
44 grayshadow
 
29.05.13
15:04
мне как раз нужна была периодичность месяц:) всем спасибо, вопрос решен:)
45 Светлый Гений
 
29.05.13
20:31
(32) Хорошо, что помогло, тоже считаю, что глюк платформы. А вообще, использование временных таблиц имеет смысл только для тех случаев, когда результат подзапроса будет использоваться несколько раз в разных частях запроса. ИМХО, в остальных случаях они прироста к производительности не дают, а наоборот, производительность падает.
46 Лефмихалыч
 
29.05.13
20:36
сами вы оба глюки платформы. Руки не той стороной в туловище вставлены просто
47 Икогнито
 
29.05.13
20:36
(45) > Хорошо, что помогло, тоже считаю, что глюк платформы.

Таких глюков у платформы не бывает. Бывают только кривые руки и невнимательность.
48 Светлый Гений
 
03.06.13
20:57
(46) (47) и в что в (0) не так? И почему когда ТС сделала вложенным запросом тоже самое все заработало? Объясните криворукому.
49 viktor_vv
 
03.06.13
21:37
(45) Вообще-то не только для многократного использования. Вложенными запросами можно конкретно башку оптимизатору sql свернуть и он такой план придумает, что сервак легко в даун уйдет.
Временными таблицами ему можно облегчить жизнь.
50 Лефмихалыч
 
03.06.13
22:55
(48) не то же самое сделала да и все
51 Dethmont
 
04.06.13
02:01
ВЫБРАТЬ РАЗРЕШЕННЫЕ
   ПродажиОбороты.Контрагент,
   ПродажиОбороты.СтоимостьОборот КАК СтоимостьОборот,
   ПродажиОбороты.Период КАК Период
ПОМЕСТИТЬ ВТПродажиИСебестоимость
ИЗ
   РегистрНакопления.Продажи.Обороты(, , Месяц, ) КАК ПродажиОбороты

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТПродажиИСебестоимость.Контрагент КАК Контрагент,
   ВТПродажиИСебестоимость.СтоимостьОборот КАК СтоимостьОборот,
   ВТПродажиИСебестоимость.Период КАК Период
ПОМЕСТИТЬ ВТПродССПоМес
ИЗ
   ВТПродажиИСебестоимость КАК ВТПродажиИСебестоимость
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТПродССПоМес.Контрагент КАК Контрагент,
   МАКСИМУМ(ВТПродССПоМес.СтоимостьОборот) КАК СтоимостьОборот
   
ИЗ
   ВТПродССПоМес КАК ВТПродССПоМес

СГРУППИРОВАТЬ ПО
   ВТПродССПоМес.Контрагент
52 Dethmont
 
04.06.13
02:01
ВНИМАТЕЛЬНО ЧИТАЕМ (1)
53 Dethmont
 
04.06.13
02:12
(46) ++
54 grayshadow
 
05.06.13
19:14
хорошо, второй пример:)
вот это возвращает пустой результат:

ВЫБРАТЬ РАЗЛИЧНЫЕ
   НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ) КАК ДатаКалендаря
ПОМЕСТИТЬ ВТМесяцы
ИЗ
   РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
   РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачалоПериода И &КонецПериода
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
   ВТМесяцы.ДатаКалендаря КАК ДатаКалендаря,
   СодержаниеДоговоровПоАптекамПоНоменклатуре.Период КАК Период,
   СодержаниеДоговоровПоАптекамПоНоменклатуре.ДоговорКонтрагента КАК ДоговорКонтрагента,
   СодержаниеДоговоровПоАптекамПоНоменклатуре.Цена * СодержаниеДоговоровПоАптекамПоНоменклатуре.Количество КАК Сумма,
   КОЛИЧЕСТВО(УслугиКопия.Период) КАК Счетчик,
   СодержаниеДоговоровПоАптекамПоНоменклатуре.Номенклатура КАК Номенклатура,
   СодержаниеДоговоровПоАптекамПоНоменклатуре.Аптека КАК Аптека,
   СодержаниеДоговоровПоАптекамПоНоменклатуре.Действует
ПОМЕСТИТЬ ВТ1
ИЗ
   РегистрСведений.СодержаниеДоговоровПоАптекамПоНоменклатуре КАК СодержаниеДоговоровПоАптекамПоНоменклатуре
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТМесяцы КАК ВТМесяцы
       ПО СодержаниеДоговоровПоАптекамПоНоменклатуре.Период <= ВТМесяцы.ДатаКалендаря
           И (СодержаниеДоговоровПоАптекамПоНоменклатуре.ДоговорКонтрагента.Владелец = &Контрагент)
           И (СодержаниеДоговоровПоАптекамПоНоменклатуре.Действует)
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СодержаниеДоговоровПоАптекамПоНоменклатуре КАК УслугиКопия
       ПО СодержаниеДоговоровПоАптекамПоНоменклатуре.Период >= УслугиКопия.Период
           И СодержаниеДоговоровПоАптекамПоНоменклатуре.ДоговорКонтрагента = УслугиКопия.ДоговорКонтрагента
           И СодержаниеДоговоровПоАптекамПоНоменклатуре.Номенклатура = УслугиКопия.Номенклатура
           И СодержаниеДоговоровПоАптекамПоНоменклатуре.Аптека = УслугиКопия.Аптека

СГРУППИРОВАТЬ ПО
   ВТМесяцы.ДатаКалендаря,
   СодержаниеДоговоровПоАптекамПоНоменклатуре.Период,
   СодержаниеДоговоровПоАптекамПоНоменклатуре.ДоговорКонтрагента,
   СодержаниеДоговоровПоАптекамПоНоменклатуре.Цена * СодержаниеДоговоровПоАптекамПоНоменклатуре.Количество,
   СодержаниеДоговоровПоАптекамПоНоменклатуре.Номенклатура,
   СодержаниеДоговоровПоАптекамПоНоменклатуре.Аптека,
   СодержаниеДоговоровПоАптекамПоНоменклатуре.Действует

ИМЕЮЩИЕ
   КОЛИЧЕСТВО(УслугиКопия.Период) <10
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТ1.ДоговорКонтрагента,
   ВТ1.Сумма
ИЗ
   ВТ1 КАК ВТ1


а вот это выводит кучу строк с результатом:

ВЫБРАТЬ РАЗЛИЧНЫЕ
   НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ) КАК ДатаКалендаря
ПОМЕСТИТЬ ВТМесяцы
ИЗ
   РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
   РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачалоПериода И &КонецПериода
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
   ВложенныйЗапрос.ДоговорКонтрагента,
   ВложенныйЗапрос.Сумма
ИЗ
   (ВЫБРАТЬ
       ВТМесяцы.ДатаКалендаря КАК ДатаКалендаря,
       СодержаниеДоговоровПоАптекамПоНоменклатуре.Период КАК Период,
       СодержаниеДоговоровПоАптекамПоНоменклатуре.ДоговорКонтрагента КАК ДоговорКонтрагента,
       СодержаниеДоговоровПоАптекамПоНоменклатуре.Цена * СодержаниеДоговоровПоАптекамПоНоменклатуре.Количество КАК Сумма,
       КОЛИЧЕСТВО(УслугиКопия.Период) КАК Счетчик,
       СодержаниеДоговоровПоАптекамПоНоменклатуре.Номенклатура КАК Номенклатура,
       СодержаниеДоговоровПоАптекамПоНоменклатуре.Аптека КАК Аптека,
       СодержаниеДоговоровПоАптекамПоНоменклатуре.Действует КАК Действует
   ИЗ
       РегистрСведений.СодержаниеДоговоровПоАптекамПоНоменклатуре КАК СодержаниеДоговоровПоАптекамПоНоменклатуре
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТМесяцы КАК ВТМесяцы
           ПО СодержаниеДоговоровПоАптекамПоНоменклатуре.Период <= ВТМесяцы.ДатаКалендаря
               И (СодержаниеДоговоровПоАптекамПоНоменклатуре.ДоговорКонтрагента.Владелец = &Контрагент)
               И (СодержаниеДоговоровПоАптекамПоНоменклатуре.Действует)
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СодержаниеДоговоровПоАптекамПоНоменклатуре КАК УслугиКопия
           ПО СодержаниеДоговоровПоАптекамПоНоменклатуре.Период >= УслугиКопия.Период
               И СодержаниеДоговоровПоАптекамПоНоменклатуре.ДоговорКонтрагента = УслугиКопия.ДоговорКонтрагента
               И СодержаниеДоговоровПоАптекамПоНоменклатуре.Номенклатура = УслугиКопия.Номенклатура
               И СодержаниеДоговоровПоАптекамПоНоменклатуре.Аптека = УслугиКопия.Аптека
   
   СГРУППИРОВАТЬ ПО
       ВТМесяцы.ДатаКалендаря,
       СодержаниеДоговоровПоАптекамПоНоменклатуре.Период,
       СодержаниеДоговоровПоАптекамПоНоменклатуре.ДоговорКонтрагента,
       СодержаниеДоговоровПоАптекамПоНоменклатуре.Цена * СодержаниеДоговоровПоАптекамПоНоменклатуре.Количество,
       СодержаниеДоговоровПоАптекамПоНоменклатуре.Номенклатура,
       СодержаниеДоговоровПоАптекамПоНоменклатуре.Аптека,
       СодержаниеДоговоровПоАптекамПоНоменклатуре.Действует
   
   ИМЕЮЩИЕ
       КОЛИЧЕСТВО(УслугиКопия.Период) < 10) КАК ВложенныйЗапрос


("выбрать различные" пришлось перенести, т.к. во вложенном эту опцию нельзя юзать)

есть желание поискать 10 отличий?:)
55 grayshadow
 
05.06.13
19:19
з.ы. это базы разных клиентов - обе КА, но разные релизы
что их объединяет - платформа 8.2.17.153:)
56 EvgeniuXP
 
05.06.13
21:58
временные таблицы - глюк - посмешили
57 Мимохожий Однако
 
05.06.13
22:15
(49)+100500
Независимо от того, куда вы едете — это в гору и против ветра!