Запрос - исключение через Имеющие

1. MaQo 02.12.23 22:26 Сейчас в теме
В данной таблице Производителей и их типов оборудования нужно получить всех производителей компьютеров, которые не производят ноутбуки. То есть в данном случае нужно получить запись Е. Мне сказали, что мое решение не оптимальное и можно решить через "Имеющие", но как надо сгруппировать и что за условие будет?
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
3. Said-We 03.12.23 00:13 Сейчас в теме
(1) Оптимально будет наверное обычное вычитание множеств, но 1С так не умеет.
А что не обычным WHERE, как второй скрин?
То что, скорее всего, от Вас хотят через Having на третьем скрине.
Прикрепленные файлы:
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. independ 1551 02.12.23 23:18 Сейчас в теме
(1)
ВЫБРАТЬ
|	Т.Производитель КАК Производитель,
|	КОЛИЧЕСТВО(*) КАК Поле1
|	СУММА(ВЫБОР
|			КОГДА Т.ТипОборудования.Наименование = "Ноутбуки"
|				ТОГДА 1
|			ИНАЧЕ 0
|		КОНЕЦ) КАК Поле2,
|ИЗ
|	Регистрсведений.Оборудование КАК Т
|ГДЕ
|	Т.ТипОборудования.Наименование = "Компьютеры"
|			ИЛИ Т.ТипОборудования.Наименование = "Ноутбуки"
|
|СГРУППИРОВАТЬ ПО
|	Т.Производитель 
|
|ИМЕЮЩИЕ
|	КОЛИЧЕСТВО(*) = 1
|И СУММА(ВЫБОР
|			КОГДА Т.ТипОборудования.Наименование = "Ноутбуки"
|				ТОГДА 1
|			ИНАЧЕ 0
|		КОНЕЦ)=0
Показать
4. Sashares 35 03.12.23 00:53 Сейчас в теме
(1)Можно так:
Выбрать
ТТ.Оборудование
Из РегистрСведений.Оборудование КАК ТТ
ГДЕ
ТТ.ТипОборудования.Наименование = "Компьютеры"
И НЕ Истина В (Выбрать Первые 1
	Истина
	Из РегистрСведений.Оборудование КАК Таб
	Где 
	Таб.ТипОборудования.Наименование = "Ноутбуки"
	И Таб.Оборудование = ТТ.Оборудование)
Показать
6. Vinzor 107 03.12.23 11:28 Сейчас в теме
(1) Ваш запрос считается "потенциально опасным" 1.1. При написании запросов не следует использовать соединения с вложенными запросами. по стандартам разработки

Я бы сделал так. Пример сделан в ЗУПе. Выбрал физлиц, у которых есть хоть одно событие "Приема" и ни одного события "Увольнения". Условия аналогичные вашим
ВЫБРАТЬ
	ТКДС.ФизическоеЛицо КАК ФизЛицо,
	СУММА(ВЫБОР	КОГДА ТКДС.ДатаПриема <> ДАТАВРЕМЯ(1, 1, 1) ТОГДА 1 ИНАЧЕ 0	КОНЕЦ) КАК КолвоПриемов,
	СУММА(ВЫБОР	КОГДА ТКДС.ДатаУвольнения <> ДАТАВРЕМЯ(1, 1, 1)	ТОГДА 1	ИНАЧЕ 0	КОНЕЦ) КАК КолвоУвольнений
ПОМЕСТИТЬ ВТ_первая
ИЗ
	РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТКДС

СГРУППИРОВАТЬ ПО
	ТКДС.ФизическоеЛицо
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_первая.ФизЛицо КАК ФизЛицо,
	ВТ_первая.КолвоПриемов КАК КолвоПриемов,
	ВТ_первая.КолвоУвольнений КАК КолвоУвольнений
ИЗ
	ВТ_первая КАК ВТ_первая
ГДЕ
	ВТ_первая.КолвоПриемов > 0
	И ВТ_первая.КолвоУвольнений = 0
Показать


Но если надо, чтобы было "имеющие", тогда так
ВЫБРАТЬ
	ТКДС.ФизическоеЛицо КАК ФизЛицо,
	СУММА(ВЫБОР
			КОГДА ТКДС.ДатаПриема <> ДАТАВРЕМЯ(1, 1, 1)
				ТОГДА 1
			ИНАЧЕ 0
		КОНЕЦ) КАК КолвоПриемов,
	СУММА(ВЫБОР
			КОГДА ТКДС.ДатаУвольнения <> ДАТАВРЕМЯ(1, 1, 1)
				ТОГДА 1
			ИНАЧЕ 0
		КОНЕЦ) КАК КолвоУвольнений
ПОМЕСТИТЬ ВТ_первая
ИЗ
	РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТКДС

СГРУППИРОВАТЬ ПО
	ТКДС.ФизическоеЛицо

ИМЕЮЩИЕ
	СУММА(ВЫБОР
			КОГДА ТКДС.ДатаПриема <> ДАТАВРЕМЯ(1, 1, 1)
				ТОГДА 1
			ИНАЧЕ 0
		КОНЕЦ) > 0 И
	СУММА(ВЫБОР
			КОГДА ТКДС.ДатаУвольнения <> ДАТАВРЕМЯ(1, 1, 1)
				ТОГДА 1
			ИНАЧЕ 0
		КОНЕЦ) = 0
Показать
16. OiSorry 04.12.23 17:48 Сейчас в теме
(1)
ВЫБРАТЬ
	"А" КАК Производитель,
	"Компьютеры" КАК ТипОборудования
ПОМЕСТИТЬ ВтДано

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

ВЫБРАТЬ
	"А",
	"Принтеры"

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

ВЫБРАТЬ
	"А",
	"Ноутбуки"

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

ВЫБРАТЬ
	"Б",
	"Компьютеры"

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

ВЫБРАТЬ
	"Б",
	"Ноутбуки"

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

ВЫБРАТЬ
	"Д",
	"Принтеры"

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

ВЫБРАТЬ
	"Е",
	"Компьютеры"

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

ВЫБРАТЬ
	"Е",
	"Принтеры"

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

ВЫБРАТЬ
	"Ц",
	"Ноутбуки"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВтДано.Производитель КАК Производитель
ИЗ
	ВтДано КАК ВтДано

СГРУППИРОВАТЬ ПО
	ВтДано.Производитель

ИМЕЮЩИЕ
	СУММА(ВЫБОР
			КОГДА ВтДано.ТипОборудования = "Ноутбуки"
				ТОГДА 1
			КОГДА ВтДано.ТипОборудования = "Компьютеры"
				ТОГДА 2
			ИНАЧЕ 0
		КОНЕЦ) = 2
Показать
3. Said-We 03.12.23 00:13 Сейчас в теме
(1) Оптимально будет наверное обычное вычитание множеств, но 1С так не умеет.
А что не обычным WHERE, как второй скрин?
То что, скорее всего, от Вас хотят через Having на третьем скрине.
Прикрепленные файлы:
5. MaQo 03.12.23 01:56 Сейчас в теме
(3) Логика
ВЫБРАТЬ что-то
ГДЕ что-то НЕ В (ВЫБРАТЬ...)
работает в 1с.
7. Said-We 03.12.23 21:51 Сейчас в теме
(5) EXCEPT, EXISTS, SOME, ALL, ANY... не работает В 1С (исключение UNION ALL, но это не тот ALL).
А всё остальное, что показано выше в переписке - работает.
15. SlavaKron 04.12.23 16:29 Сейчас в теме
(3) 3-й скрин. Расчет на то, что "Н" > "К"? А если перефразировать условие: "получить всех производителей ноутбуков, которые не производят компьютеры", – для каждого типа свой запрос писать?)
Следует добавить count(distinct type) = 1
17. Said-We 05.12.23 00:07 Сейчас в теме
(15) В {12} более общее условие, поэтому можно не писать для каждого типа свой запрос.
В {3} пример, что бы было понятен смысл и для конкретного случая автора. Вариантов решения данной задачи множество.
8. MaximSh 9 04.12.23 15:06 Сейчас в теме
(1) Пример, где &Роль массив с двумя значениями

ВЫБРАТЬ
ПраваРолей.ОбъектМетаданных КАК ОбъектМетаданных,
СУММА(1) КАК Сумма
ИЗ
РегистрСведений.ПраваРолей КАК ПраваРолей
ГДЕ
ПраваРолей.Роль В(&Роль)

СГРУППИРОВАТЬ ПО
ПраваРолей.ОбъектМетаданных

ИМЕЮЩИЕ
СУММА(1) = 2
9. Sashares 35 04.12.23 15:16 Сейчас в теме
(8)Как применить это для условия, что надо получить объекты метаданных, которые есть в Роль1 и нет в Роль2?
10. MaximSh 9 04.12.23 15:17 Сейчас в теме
12. Said-We 04.12.23 15:28 Сейчас в теме
(10) Так это может быть другая одна роль. Т.е. Роль2 есть, а Роль1 нет. А нужно наоборот.
Тут удобнее не сумму использовать, а MAX() или MIN(), только надо знать кто из них меньше кого, но это тоже можно прописать в условии примерно так:
(&Производитель1 > &Производитель2 and MIN(p) = &Производитель1
OR &Производитель1 < &Производитель2 and MAX(p) = &Производитель1)

Если в источнике вдруг появятся по несколько записей по каждому производителю и типу (ещё одно измерение добавили), а вы их складываете sum(1), то запрос не будет давать нужного результата.
11. MaximSh 9 04.12.23 15:23 Сейчас в теме
(9) Сумма(выбор когда ТипОборудования=Ноутбуки тогда 1 иначе 0 конец) КАК ПроизводитНоутбуки
Сумма(выбор когда ТипОборудования=Компьютеры тогда 1 иначе 0 конец) КАК ПроизводитКомпы
Имеющие Сумма(выбор когда ТипОборудования=Ноутбуки тогда 1 иначе 0 конец) = 0
И Имеющие Сумма(выбор когда ТипОборудования=Компьютеры тогда 1 иначе 0 конец) = 1
13. MaximSh 9 04.12.23 15:33 Сейчас в теме
(1) и лично я бы получил в ВТ производителей ноутбуков, потом из начальной таблицы вычел ВТ, в условии к основной таблице что производит компьютер. Никаких имеющих. Но с Имеющие и правда, наверное, менее затратно на миллисекунду
14. Said-We 04.12.23 15:34 Сейчас в теме
(13) Менее затратно наверное будет EXCEPT, но в 1С этого нет. Может быть, как раз из-за того, что это менее затратно по времени :-) (шутка).
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот