В данной таблице Производителей и их типов оборудования нужно получить всех производителей компьютеров, которые не производят ноутбуки. То есть в данном случае нужно получить запись Е. Мне сказали, что мое решение не оптимальное и можно решить через "Имеющие", но как надо сгруппировать и что за условие будет?
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
ВЫБРАТЬ
| Т.Производитель КАК Производитель,
| КОЛИЧЕСТВО(*) КАК Поле1
| СУММА(ВЫБОР
| КОГДА Т.ТипОборудования.Наименование = "Ноутбуки"
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ) КАК Поле2,
|ИЗ
| Регистрсведений.Оборудование КАК Т
|ГДЕ
| Т.ТипОборудования.Наименование = "Компьютеры"
| ИЛИ Т.ТипОборудования.Наименование = "Ноутбуки"
|
|СГРУППИРОВАТЬ ПО
| Т.Производитель
|
|ИМЕЮЩИЕ
| КОЛИЧЕСТВО(*) = 1
|И СУММА(ВЫБОР
| КОГДА Т.ТипОборудования.Наименование = "Ноутбуки"
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ)=0 Показать
(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 Показать
(1)
ВЫБРАТЬ
"А" КАК Производитель,
"Компьютеры" КАК ТипОборудования
ПОМЕСТИТЬ ВтДано
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"А",
"Принтеры"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"А",
"Ноутбуки"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Б",
"Компьютеры"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Б",
"Ноутбуки"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Д",
"Принтеры"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Е",
"Компьютеры"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Е",
"Принтеры"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Ц",
"Ноутбуки"
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВтДано.Производитель КАК Производитель
ИЗ
ВтДано КАК ВтДано
СГРУППИРОВАТЬ ПО
ВтДано.Производитель
ИМЕЮЩИЕ
СУММА(ВЫБОР
КОГДА ВтДано.ТипОборудования = "Ноутбуки"
ТОГДА 1
КОГДА ВтДано.ТипОборудования = "Компьютеры"
ТОГДА 2
ИНАЧЕ 0
КОНЕЦ) = 2 Показать
(1) Пример, где &Роль массив с двумя значениями
ВЫБРАТЬ
ПраваРолей.ОбъектМетаданных КАК ОбъектМетаданных,
СУММА(1) КАК Сумма
ИЗ
РегистрСведений.ПраваРолей КАК ПраваРолей
ГДЕ
ПраваРолей.Роль В(&Роль)
СГРУППИРОВАТЬ ПО
ПраваРолей.ОбъектМетаданных
ИМЕЮЩИЕ
СУММА(1) = 2
ВЫБРАТЬ
ПраваРолей.ОбъектМетаданных КАК ОбъектМетаданных,
СУММА(1) КАК Сумма
ИЗ
РегистрСведений.ПраваРолей КАК ПраваРолей
ГДЕ
ПраваРолей.Роль В(&Роль)
СГРУППИРОВАТЬ ПО
ПраваРолей.ОбъектМетаданных
ИМЕЮЩИЕ
СУММА(1) = 2
(10) Так это может быть другая одна роль. Т.е. Роль2 есть, а Роль1 нет. А нужно наоборот.
Тут удобнее не сумму использовать, а MAX() или MIN(), только надо знать кто из них меньше кого, но это тоже можно прописать в условии примерно так:
Если в источнике вдруг появятся по несколько записей по каждому производителю и типу (ещё одно измерение добавили), а вы их складываете sum(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 иначе 0 конец) КАК ПроизводитКомпы
Имеющие Сумма(выбор когда ТипОборудования=Ноутбуки тогда 1 иначе 0 конец) = 0
И Имеющие Сумма(выбор когда ТипОборудования=Компьютеры тогда 1 иначе 0 конец) = 1
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот