|
1C СКД Получить среднее по месяцам с учетом нулевых значений | ☑ | ||
---|---|---|---|---|
0
evorle145
24.03.23
✎
12:15
|
В простейшем запросе:
ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.ПериодМесяц, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.СтоимостьОборот ИЗ РегистрНакопления.Продажи.Обороты(, , Авто, ) КАК ПродажиОбороты в СКД поставил считать Среднее по итогу: https://ibb.co/MsLHwk9 Но среднее считает верно только если в месяцах продаж больше 0: https://ibb.co/dtgXZFs если пишут там: Сумма(КоличествоОборот)/Количество(ПериодМесяц) то результат тот же.. |
|||
1
Гена
гуру
24.03.23
✎
12:28
|
Во всех знаменателях я бы поставил условие ненулёвости
|
|||
2
lEvGl
гуру
24.03.23
✎
12:31
|
та не 0 а нул наверно
|
|||
3
lEvGl
гуру
24.03.23
✎
12:31
|
там
|
|||
4
lEvGl
гуру
24.03.23
✎
12:44
|
поэтому что там можно... периодичность месяц или сначала из календаря взять даты, к ним лепить обороты с заменой нулов
|
|||
5
lEvGl
гуру
24.03.23
✎
12:50
|
+ в запросе как бы даже не нулы, а просто записей нет, в ячейках скд рисует неопределено, поэтому нужно самому создать "временную сетку"
|
|||
6
evorle145
24.03.23
✎
12:51
|
(4) так и делаю, но вот порадокс:
Если я создаю таблицу периодов и к ней левым соединением присоединяю таблицу продаж, то в итоговой таблице получаю только одну строку! То есть пероиды где не было продаж исчезают. Но исчезают они только если в левом соединении я вытаскиваю хотя бы одно поле из присоединяемой таблицы. Вот такой результат запроса будет после левого соединения: ПериодМесяц 01.09.2019 0:00:00 01.05.2021 0:00:00 01.03.2020 0:00:00 01.12.2021 0:00:00 01.08.2020 0:00:00 01.01.2022 0:00:00 01.03.2023 0:00:00 А вот сам запрос: ВЫБРАТЬ ПродажиОбороты.ПериодМесяц ПОМЕСТИТЬ ПродажиПериод ИЗ РегистрНакопления.Продажи.Обороты({(&НачПериода)}, {(&КонПериода)}, Авто, ) КАК ПродажиОбороты СГРУППИРОВАТЬ ПО ПродажиОбороты.ПериодМесяц ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПродажиОбороты.Номенклатура, ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0) КАК КоличествоОборот, ПродажиОбороты.ПериодМесяц ПОМЕСТИТЬ ТаблицаПродаж ИЗ РегистрНакопления.Продажи.Обороты(&НачПериода {(&НачПериода)}, &КонПериода {(&КонПериода)}, Авто, ) КАК ПродажиОбороты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПродажиПериод.ПериодМесяц ИЗ ПродажиПериод КАК ПродажиПериод ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаПродаж КАК ТаблицаПродаж ПО ПродажиПериод.ПериодМесяц = ТаблицаПродаж.ПериодМесяц |
|||
7
evorle145
24.03.23
✎
12:52
|
но стоит мне в запросе хотя бы номенклатуру вытащить:
//////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПродажиПериод.ПериодМесяц, ТаблицаПродаж.Номенклатура ИЗ ПродажиПериод КАК ПродажиПериод ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаПродаж КАК ТаблицаПродаж ПО ПродажиПериод.ПериодМесяц = ТаблицаПродаж.ПериодМесяц то все..... таблица итоговая сразу имеет вид: ПериодМесяц Номенклатура 01.03.2023 0:00:00 Амортизатор 2217 (газовый) "Белкарл" |
|||
8
toypaul
гуру
24.03.23
✎
12:55
|
сделай объединение основной таблицы, с пустой таблицей (номенклатура + месяц и ресурс = 0)
|
|||
9
magicSan
24.03.23
✎
12:56
|
(0) ВЫБРАТЬ
ПродажиОбороты.Номенклатура, ПродажиОбороты.ПериодМесяц, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.СтоимостьОборот ИЗ РегистрНакопления.Продажи.Обороты(, , Авто, ) КАК ПродажиОбороты ИТОГИ СУММА(КоличествоОборот) ПО Период ПЕРИОДАМИ(ДЕНЬ, , ), Номенклатура |
|||
10
toypaul
гуру
24.03.23
✎
12:57
|
(9) в СКД?
|
|||
11
evorle145
24.03.23
✎
14:02
|
(8) Спасибо большое! именно так и сделал... Что-то для меня стало открытием , что если в СКД делать левое соединение по null полям, и не оборачивать в есть null, то левая таблица целиком не будет выводиться...
В итоге запрос принят вид: ВЫБРАТЬ НАЧАЛОПЕРИОДА(ВложенныйЗапрос.Период, МЕСЯЦ) КАК ПериодМесяц ПОМЕСТИТЬ ПродажиПериод ИЗ (ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&НачПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d) КАК Период ИЗ (ВЫБРАТЬ 0 КАК a ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК aa ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК b ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК bb ПО (ИСТИНА) ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК c ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК cc ПО (ИСТИНА) ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК d ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК dd ПО (ИСТИНА) ГДЕ aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачПериода, &КонПериода, ДЕНЬ)) КАК ВложенныйЗапрос СГРУППИРОВАТЬ ПО НАЧАЛОПЕРИОДА(ВложенныйЗапрос.Период, МЕСЯЦ) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЕСТЬNULL(ПродажиОбороты.Номенклатура, ЗНАЧЕНИЕ(Справочник.Номенклатура.Пустаяссылка)) КАК Номенклатура, ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0) КАК КоличествоОборот, ЕСТЬNULL(ПродажиОбороты.СтоимостьОборот, 0) КАК СтоимостьОборот, ПродажиОбороты.ПериодМесяц КАК ПериодМесяцОборот ПОМЕСТИТЬ Продажи ИЗ РегистрНакопления.Продажи.Обороты({(&НачПериода)}, {(&КонПериода)}, Авто, ) КАК ПродажиОбороты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Продажи.Номенклатура ПОМЕСТИТЬ ТаблицаНоменклатура ИЗ Продажи КАК Продажи СГРУППИРОВАТЬ ПО Продажи.Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПродажиПериод.ПериодМесяц, ТаблицаНоменклатура.Номенклатура ПОМЕСТИТЬ ТаблицаПериодМесяцИНоменклатура ИЗ ПродажиПериод КАК ПродажиПериод ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаНоменклатура КАК ТаблицаНоменклатура ПО (ИСТИНА) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВЛ_ОстаткиЦены.Номенклатура, МАКСИМУМ(ЕСТЬNULL(ВЛ_ОстаткиЦены.Остаток, 0)) КАК Остаток, МАКСИМУМ(ЕСТЬNULL(ВЛ_ОстаткиЦены.ЦенаЗакупочная, 0)) КАК ЦенаЗакупочная ПОМЕСТИТЬ ТаблицаОстаткиИЦены ИЗ (ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток, 0 КАК ЦенаЗакупочная ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЦеныНоменклатурыСрезПоследних.Номенклатура, 0, ЦеныНоменклатурыСрезПоследних.Цена ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних) КАК ВЛ_ОстаткиЦены СГРУППИРОВАТЬ ПО ВЛ_ОстаткиЦены.Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТаблицаПериодМесяцИНоменклатура.ПериодМесяц, ТаблицаПериодМесяцИНоменклатура.Номенклатура, ЕСТЬNULL(Продажи.КоличествоОборот, 0) КАК Количество, ТаблицаОстаткиИЦены.Остаток, ТаблицаОстаткиИЦены.ЦенаЗакупочная, ТаблицаПериодМесяцИНоменклатура.Номенклатура.Артикул КАК Артикул ИЗ ТаблицаПериодМесяцИНоменклатура КАК ТаблицаПериодМесяцИНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ Продажи КАК Продажи ПО ТаблицаПериодМесяцИНоменклатура.ПериодМесяц = Продажи.ПериодМесяцОборот И ТаблицаПериодМесяцИНоменклатура.Номенклатура = Продажи.Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаОстаткиИЦены КАК ТаблицаОстаткиИЦены ПО ТаблицаПериодМесяцИНоменклатура.Номенклатура = ТаблицаОстаткиИЦены.Номенклатура |
|||
12
evorle145
24.03.23
✎
14:03
|
(9) наверное тоже вариант, но я уже забубенил через левое соединение с таблицой Пероидмесяц + номенклатура левое соединение с продажами
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |