В данной таблице Производителей и их типов оборудования нужно получить всех производителей компьютеров, которые не производят ноутбуки. То есть в данном случае нужно получить запись Е. Мне сказали, что мое решение не оптимальное и можно решить через "Имеющие", но как надо сгруппировать и что за условие будет?
(1) Оптимально будет наверное обычное вычитание множеств, но 1С так не умеет.
А что не обычным WHERE, как второй скрин?
То что, скорее всего, от Вас хотят через Having на третьем скрине.
Выбрать
ТТ.Оборудование
Из РегистрСведений.Оборудование КАК ТТ
ГДЕ
ТТ.ТипОборудования.Наименование = "Компьютеры"
И НЕ Истина В (Выбрать Первые 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
ВЫБРАТЬ
"А" КАК Производитель,
"Компьютеры" КАК ТипОборудования
ПОМЕСТИТЬ ВтДано
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"А",
"Принтеры"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"А",
"Ноутбуки"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Б",
"Компьютеры"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Б",
"Ноутбуки"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Д",
"Принтеры"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Е",
"Компьютеры"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Е",
"Принтеры"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Ц",
"Ноутбуки"
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВтДано.Производитель КАК Производитель
ИЗ
ВтДано КАК ВтДано
СГРУППИРОВАТЬ ПО
ВтДано.Производитель
ИМЕЮЩИЕ
СУММА(ВЫБОР
КОГДА ВтДано.ТипОборудования = "Ноутбуки"
ТОГДА 1
КОГДА ВтДано.ТипОборудования = "Компьютеры"
ТОГДА 2
ИНАЧЕ 0
КОНЕЦ) = 2
(1) Оптимально будет наверное обычное вычитание множеств, но 1С так не умеет.
А что не обычным WHERE, как второй скрин?
То что, скорее всего, от Вас хотят через Having на третьем скрине.
(5) EXCEPT, EXISTS, SOME, ALL, ANY... не работает В 1С (исключение UNION ALL, но это не тот ALL).
А всё остальное, что показано выше в переписке - работает.
(3) 3-й скрин. Расчет на то, что "Н" > "К"? А если перефразировать условие: "получить всех производителей ноутбуков, которые не производят компьютеры", – для каждого типа свой запрос писать?)
Следует добавить count(distinct type) = 1
(15) В {12} более общее условие, поэтому можно не писать для каждого типа свой запрос.
В {3} пример, что бы было понятен смысл и для конкретного случая автора. Вариантов решения данной задачи множество.
(10) Так это может быть другая одна роль. Т.е. Роль2 есть, а Роль1 нет. А нужно наоборот.
Тут удобнее не сумму использовать, а MAX() или MIN(), только надо знать кто из них меньше кого, но это тоже можно прописать в условии примерно так:
(&Производитель1 > &Производитель2 and MIN(p) = &Производитель1
OR &Производитель1 < &Производитель2 and MAX(p) = &Производитель1)
Если в источнике вдруг появятся по несколько записей по каждому производителю и типу (ещё одно измерение добавили), а вы их складываете sum(1), то запрос не будет давать нужного результата.
(9) Сумма(выбор когда ТипОборудования=Ноутбуки тогда 1 иначе 0 конец) КАК ПроизводитНоутбуки
Сумма(выбор когда ТипОборудования=Компьютеры тогда 1 иначе 0 конец) КАК ПроизводитКомпы
Имеющие Сумма(выбор когда ТипОборудования=Ноутбуки тогда 1 иначе 0 конец) = 0
И Имеющие Сумма(выбор когда ТипОборудования=Компьютеры тогда 1 иначе 0 конец) = 1
(1) и лично я бы получил в ВТ производителей ноутбуков, потом из начальной таблицы вычел ВТ, в условии к основной таблице что производит компьютер. Никаких имеющих. Но с Имеющие и правда, наверное, менее затратно на миллисекунду