Запрос по контрагентам у которых не было продаж
Доброго времени суток эксперты!
Учусь писать запросы, так вот застрял на том как написать следующий запрос: вывожу всех контрагентов у которых не было продаж за период
Где я ошибаюсь?
Учусь писать запросы, так вот застрял на том как написать следующий запрос: вывожу всех контрагентов у которых не было продаж за период
ВЫБРАТЬ
Контрагенты.Ссылка,
Продажи.Стоимость,
Продажи.ДокументПродажи
ИЗ
РегистрНакопления.Продажи КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО Продажи.Контрагент = Контрагенты.Ссылка
Где Продажи.Стоимость is null
ПоказатьГде я ошибаюсь?
По теме из базы знаний
- «Программное заполнение настроек СКД» или «Как сделать отчёт на СКД с понятным для пользователя интерфейсом». (1С: Предприятие 8.1, 8.2 обычное приложение)
- Опыт успешного внедрения УТ 11 в небольшом подразделении большой компании
- Нейросеть для прогнозирования: универсальная обработка и методика для любой конфигурации. Примеры прогнозирования бизнес процессов
- Загрузка чеков из ФНС в документы 1С:БП, УНФ, ERP, КА и УТ
- Анализ номенклатуры без движения за определенный период (1С:УНФ)
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
ВЫБРАТЬ
Контрагенты.Ссылка,
Продажи.Стоимость,
Продажи.ДокументПродажи
ИЗ
РегистрНакопления.Продажи КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО Продажи.Контрагент = Контрагенты.Ссылка
Где ЕстьNull(Продажи.Стоимость, 0) = 0
Показать
(1) Если у вас продажи "за период", то как минимум не хватает параметров в запросе к виртуальной таблице. Без них он вам за всю историю существования базы выдаст данные. Ну и да, соединение в обратную сторону.
ВЫБРАТЬ
Контрагенты.Ссылка,
Продажи.Стоимость,
Продажи.ДокументПродажи
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи(&ДатаНач, &ДатаКон, , ) КАК Продажи
ПО Продажи.Контрагент = Контрагенты.Ссылка
Где Продажи.Стоимость ЕСТЬ NULL
Показать
Жестоко Вы как...
Делайте проще и еще проще :
Простая логика - сначала выбираем всех контрагентов у которых были покупки за период во временную таблицу :
а за тем связываем со всеми контрагентами в еще одной временной таблице
а потом применяем условие
Вуаля.
Делайте проще и еще проще :
Простая логика - сначала выбираем всех контрагентов у которых были покупки за период во временную таблицу :
ВЫБРАТЬ РАЗЛИЧНЫЕ
Продажи .Контрагент КАК Покупатель
ПОМЕСТИТЬ ВТ_Покупатели
ИЗ
РегистрНакопления.Продажи КАК Продажи
ГДЕ
Продажи .Сумма > 0
И Продажи.Период МЕЖДУ &ПериодНачало И &ПериодОкончание
;
Показатьа за тем связываем со всеми контрагентами в еще одной временной таблице
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка,
ВТ_Покупатели.Покупатель = Контрагенты.Ссылка КАК Купил
ПОМЕСТИТЬ ВТ_ВсеКонтрагенты
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Покупатели КАК ВТ_Покупатели
ПО Контрагенты.Ссылка = ВТ_Покупатели.Покупатель
;
Показатьа потом применяем условие
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_ВсеКонтрагенты.Ссылка КАК Контрагент
ИЗ
ВТ_ВсеКонтрагенты КАК ВТ_ВсеКонтрагенты
ГДЕ
ВТ_ВсеКонтрагенты.Купил = ЛОЖЬ
Вуаля.
Вопрос принципиально в ошибках : Вот запрос и результат:
Запрос: ВТ_Продажи (Записей в результате: 0)
Контрагент
Теперь сделаем по другому : Левое соединение от Контрагентов :
получим искомый результат (то что хотели):
Контрагент
Любимый
Другой
Но жизнь сложнее , нам необходимо выбирать продажи без возвратов :
и тогда простой вариант не катит :( :
получаем результат пустой.... Проверяйте
ВЫБРАТЬ
"Ассоль" КАК Контрагент
ПОМЕСТИТЬ ВТ_Контрагенты
ОБЪЕДИНИТЬ
ВЫБРАТЬ
"Комплесный"
ОБЪЕДИНИТЬ
ВЫБРАТЬ
"Другой"
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
"Ассоль" КАК Контрагент,
10 КАК Сумма
ПОМЕСТИТЬ ВТ_Продажи
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Комплексный",
10
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Комплексный",
10
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_Контрагенты.Контрагент КАК Контрагент
ИЗ
ВТ_Продажи КАК ВТ_Продажи
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Контрагенты КАК ВТ_Контрагенты
ПО ВТ_Продажи.Контрагент = ВТ_Контрагенты.Контрагент
ГДЕ
ВТ_Продажи.Контрагент ЕСТЬ NULL
ПоказатьЗапрос: ВТ_Продажи (Записей в результате: 0)
Контрагент
Теперь сделаем по другому : Левое соединение от Контрагентов :
ВЫБРАТЬ
"Ассоль" КАК Контрагент
ПОМЕСТИТЬ ВТ_Контрагенты
ОБЪЕДИНИТЬ
ВЫБРАТЬ
"Комплексный"
ОБЪЕДИНИТЬ
ВЫБРАТЬ
"Любимый"
ОБЪЕДИНИТЬ
ВЫБРАТЬ
"Другой"
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
"Ассоль" КАК Контрагент,
10 КАК Сумма
ПОМЕСТИТЬ ВТ_Продажи
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Комплексный",
10
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Комплексный",
10
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_Контрагенты.Контрагент КАК Контрагент
ИЗ
ВТ_Контрагенты КАК ВТ_Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Продажи КАК ВТ_Продажи
ПО ВТ_Контрагенты.Контрагент = ВТ_Продажи.Контрагент
ГДЕ
ВТ_Продажи.Контрагент ЕСТЬ NULL
Показатьполучим искомый результат (то что хотели):
Контрагент
Любимый
Другой
Но жизнь сложнее , нам необходимо выбирать продажи без возвратов :
и тогда простой вариант не катит :( :
ВЫБРАТЬ
"Ассоль" КАК Контрагент
ПОМЕСТИТЬ ВТ_Контрагенты
ОБЪЕДИНИТЬ
ВЫБРАТЬ
"Комплексный"
ОБЪЕДИНИТЬ
ВЫБРАТЬ
"Любимый"
ОБЪЕДИНИТЬ
ВЫБРАТЬ
"Другой"
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
"Ассоль" КАК Контрагент,
10 КАК Сумма
ПОМЕСТИТЬ ВТ_Продажи
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Комплексный",
10
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Комплексный",
10
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_Контрагенты.Контрагент КАК Контрагент
ИЗ
ВТ_Контрагенты КАК ВТ_Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Продажи КАК ВТ_Продажи
ПО ВТ_Контрагенты.Контрагент = ВТ_Продажи.Контрагент
ГДЕ
ВТ_Продажи.Контрагент ЕСТЬ NULL
И ВТ_Продажи.Сумма > 0
Показатьполучаем результат пустой.... Проверяйте
(18)Вы прикалываетесь или реально не понимаете как работают виртуальная таблица оборотов регистра накопления?
Судя по тому, что вы написали, возвраты у вас регистрируются в том же регистре, что и продажи.
Если это так, то обороты дадут сразу результат с учетом возвратов. Если необходимо узнать количество именно возвратов, то выводим обороты, противоположные регистрации продаж.
Если возвраты регистрируются в другом регистре, то левое соединение контрагентов с оборотами этого регистра даст все возвраты. Если необходо узнать, по каким контрагентам не было возвратов, так же ограничивает запрос конструкцией ГДЕ ВозвратыОбороты.Контрагент IS NULL
Судя по тому, что вы написали, возвраты у вас регистрируются в том же регистре, что и продажи.
Если это так, то обороты дадут сразу результат с учетом возвратов. Если необходимо узнать количество именно возвратов, то выводим обороты, противоположные регистрации продаж.
Если возвраты регистрируются в другом регистре, то левое соединение контрагентов с оборотами этого регистра даст все возвраты. Если необходо узнать, по каким контрагентам не было возвратов, так же ограничивает запрос конструкцией ГДЕ ВозвратыОбороты.Контрагент IS NULL
Держи, брат
ВЫБРАТЬ
"Ассоль" КАК Контрагент
ПОМЕСТИТЬ ВТ_Контрагенты
ОБЪЕДИНИТЬ
ВЫБРАТЬ
"Комплесный"
ОБЪЕДИНИТЬ
ВЫБРАТЬ
"Другой"
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
"Ассоль" КАК Контрагент,
10 КАК Сумма
ПОМЕСТИТЬ ВТ_Продажи
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Комплексный",
10
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Комплексный",
10
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_Контрагенты.Контрагент КАК Контрагент
ИЗ
ВТ_Продажи КАК ВТ_Продажи
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Контрагенты КАК ВТ_Контрагенты
ПО ВТ_Продажи.Контрагент = ВТ_Контрагенты.Контрагент
ГДЕ
ВТ_Продажи.Контрагент ЕСТЬ NULL
Показать
(24) А может все просто и им за количество строк кода стали платить , а мы с вами отстали?
Это кроме того , что в половине примеров вообще бред...
Это кроме того , что в половине примеров вообще бред...
ВЫБРАТЬ
Контрагенты.Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи КАК Продажи
ПО Продажи.Контрагент = Контрагенты.Ссылка
Где Продажи.Стоимость is null
ну я бы брал не стоимость в условии а количество (патамушо корректировки могут быть))) ну и обороты использовать, а не чистую таблицу
ВЫБРАТЬ
Контрагенты.Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(<ну там параметры нужные, если что ))>) КАК Продажи
ПО Контрагенты.Ссылка = Продажи.Контрагент
ИМЕЮЩИЕ
ЕСТЬNULL(Продажи.КоличествоОборот, 0) = 0
Показать
(26) Исправил
ВЫБРАТЬ
Контрагенты.Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты() КАК Продажи
ПО Контрагенты.Ссылка = Продажи.Контрагент
group by Контрагенты.Ссылка
ИМЕЮЩИЕ
sum(ЕСТЬNULL(Продажи.КоличествоОборот, 0)) = 0
Показать
Выведите список источников, из которых не было клиентов, либо клиенты пришедшие из которых не совершали заказов или отказывались от заказов. Под клиентами, которые отказывались от заказов, необходимо понимать клиентов, у которых есть заказы, которые на момент выполнения запроса находятся в состоянии 'rejected'. В запросе необходимо использовать оператор UNI ON для объединения выборок по разным условиям.
выдает что не все строки при таком раскладе:
SEL ECT sc.name source_name
FR OM source AS sc
INNER JOIN client c on c.source_id = sc.id
INNER JOIN sale s on s.client_id = c.id
INNER JOIN status st on st.id = s.status_id
WHERE NOT EXISTS (SEL ECT * FR OM source AS sc
WHERE sc.id = c.source_id)
union all
SEL ECT sc.name source_name
FR OM source AS sc
INNER JOIN client c on c.source_id = sc.id
INNER JOIN sale s on s.client_id = c.id
INNER JOIN status st on st.id = s.status_id
WH ERE st.name = 'rejected' or s.status_id is null
group by sc.id
помогите плиз.
выдает что не все строки при таком раскладе:
SEL ECT sc.name source_name
FR OM source AS sc
INNER JOIN client c on c.source_id = sc.id
INNER JOIN sale s on s.client_id = c.id
INNER JOIN status st on st.id = s.status_id
WHERE NOT EXISTS (SEL ECT * FR OM source AS sc
WHERE sc.id = c.source_id)
union all
SEL ECT sc.name source_name
FR OM source AS sc
INNER JOIN client c on c.source_id = sc.id
INNER JOIN sale s on s.client_id = c.id
INNER JOIN status st on st.id = s.status_id
WH ERE st.name = 'rejected' or s.status_id is null
group by sc.id
помогите плиз.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот