Имя: Пароль:
1C
 
ИМЕЮЩИЕ (having) в запросе 1с
0 Индийска праграмиста
 
09.07.10
12:22
Объясните плз кратко и точно, что значит этот оператор. Я интуитивно что то понимаю, но до конца понять не могу.
Оператор ГДЕ ставит условия на исходные поля запроса, т.е. до их группировки и расчета агрегатных функций.
А оператор ИМЕЮЩИЕ ставит условия уже на сгруппированный запрос и уже на результат агрегатных функций над полями.
Правильно я понимаю?
1 rotting
 
09.07.10
12:24
Правильно.
2 Индийска праграмиста
 
09.07.10
12:26
супер..тогда следующая конструкция в запросе

   |    ИМЕЮЩИЕ
   |        КОЛИЧЕСТВО(*) = 1

это аналогично использованию ВЫБРАТЬ ПЕРВЫЕ 1 ?
3 acsent
 
09.07.10
12:28
Удобно представлять ИМЕЮЩИЕ след. образом.
Сгруппированный запрос оборачиваем в выборку и к нему применяем ГДЕ
4 73
 
09.07.10
12:28
(2) нет
5 Индийска праграмиста
 
09.07.10
12:38
(3) спасибо..на самом деле удобно
(4) тогда как?..если в запросе одна запись, то она выведется, а если не одна запись, то результат запроса будет пустой?
6 Defender aka LINN
 
09.07.10
12:42

Выбрать
   ...
ИЗ
   ...
ИМЕЮЩИЕ
   ФУНКЦИЯ(Поле) = <условие>
СГРУППИРОВАТЬ ПО
   ...

аналогично (с точки зрения результата запроса)

Выбрать
   ...
ИЗ
   (Выбрать
       ...
       ФУНКЦИЯ(Поле) КАК Поле
   ИЗ
       ...
   СГРУППИРОВАТЬ ПО
       ...) КАК ВложенныйЗапрос
ГДЕ
   Поле = <условие>
7 73
 
09.07.10
12:47
(5) "Первые 1" есть и у нескольких записей...
Так что, "Первые 1" не равносильно " Имеющие Количество(*)=1".
8 Fragster
 
гуру
09.07.10
12:49
(6) ага, только итоги и имеющие кажись можно юзать, а во воложенном запрсе - фиг
9 Alpinist22
 
09.07.10
12:54
Уроки от Чистова посмотри, там про ИМЕЮЩИЕ он подробно рассказывает и показывает.
10 Alpinist22
 
09.07.10
12:55
Пример использования вместе с группировками:
11 Alpinist22
 
09.07.10
12:58
ВЫБРАТЬ
   ПоступлениеТоваровУслуг.Контрагент,
   СУММА(ПоступлениеТоваровУслуг.СуммаДокумента) КАК СуммаДокумента
ИЗ
   Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг

СГРУППИРОВАТЬ ПО
   ПоступлениеТоваровУслуг.Контрагент

ИМЕЮЩИЕ
   СУММА(ПоступлениеТоваровУслуг.СуммаДокумента) > 1000

Если использовать ГДЕ то будет ошибка!
12 Andry888
 
09.07.10
13:00
(11) ты просто не умеешь "ГДЕ" готовить.)
13 Alpinist22
 
09.07.10
13:02
(12) а че его там готовить, вложенный запрос и вот он ГДЕ на выходе =)
14 Alpinist22
 
09.07.10
13:02
(12) я уже знатный Кулинар стал, буду вас учить готовить )))
15 Andry888
 
09.07.10
13:03
ВЫБРАТЬ
   ПоступлениеТоваровУслуг.Контрагент,
   СУММА(ПоступлениеТоваровУслуг.СуммаДокумента) КАК СуммаДокумента
ИЗ
   Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг

ГДЕ ПоступлениеТоваровУслуг.Контрагент=&К

СГРУППИРОВАТЬ ПО
   ПоступлениеТоваровУслуг.Контрагент

ИМЕЮЩИЕ
   СУММА(ПоступлениеТоваровУслуг.СуммаДокумента) > 1000

работает ведь.)
16 Русмус
 
09.07.10
13:41
(2) нет.
|    ИМЕЮЩИЕ
|        КОЛИЧЕСТВО(*) = 1
вернет пустую таблицу, если после группировки осталось больше одной записи и собственно таблицу с этой одной записью в противном случае
17 Ненавижу 1С
 
гуру
09.07.10
13:42
(16) да вы гоните
18 Alpinist22
 
09.07.10
13:43
(15) еще бы не работать ему, ты все правильно сделал ;)
19 Defender aka LINN
 
09.07.10
13:44
(11) Не будет ошибки. Потому что я хочу получить сумму всех строк, где сумма больше 1000. А вот то, что результат может отличаться от желания пейсателя запроса - да, может.
20 Alpinist22
 
09.07.10
13:47
(19) замени ИМЕЮЩИЕ на ГДЕ и попробуй выполнить )))
21 Defender aka LINN
 
09.07.10
13:50
(20) Ты ж понимаешь, что я условие в другое место вставлю и функцию уберу при этом?
22 НетуаНадо
 
09.07.10
13:51
ГДЕ - условие над каждой записью группировки
ИМЕЮЩИЕ - условие над результатом группировки
23 Alpinist22
 
09.07.10
13:53
(21) ну ты ведь тоже должен понимать что я написал про ошибку при замене ИМЕЮЩИЕ на ГДЕ...
(22) краткость сестра таланта
24 Русмус
 
09.07.10
13:55
(17) неужели? давайте по порядку:
таблица сворачивается по группировкам, и к ней применяется условие
Количество(*) - это количество всех записей таблицы. Соответственно, результат будет, только если записей ровно одна
25 Defender aka LINN
 
09.07.10
13:56
(24) "Количество(*) - это количество всех записей таблицы" - садись, два.
26 Fram
 
09.07.10
14:00
+(25) я бы даже сказал КОЛ
27 Ненавижу 1С
 
гуру
09.07.10
14:01
+(26) садись на кол
28 Русмус
 
09.07.10
14:16
(25) каюсь, ошибся.
Запрос
   "ВЫБРАТЬ ""а"" КАК п1, ""1"" КАК п2 ПОМЕСТИТЬ Т
   |ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""б"", ""1""
   |ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""б"", ""2""
   |ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""в"", ""1""
   |;
   |
   |ВЫБРАТЬ
   |    п1
   |ИЗ
   |    Т
   |СГРУППИРОВАТЬ ПО
   |    п1
   |ИМЕЮЩИЕ
   |    КОЛИЧЕСТВО(*) = 1"
вернул
   "а"
   "в"
29 Индийска праграмиста
 
09.07.10
14:37
тема собственно по поводу этого запроса создана...зачем так сделано?

"ВЫБРАТЬ
                  |    СоответсвиеПодразделений.Подразделение,
                  |    СоответсвиеПодразделений.Организация,
                  |    МИНИМУМ(СоответсвиеПодразделений.ПодразделениеОрганизации) КАК ПодразделениеОрганизации,
                  |    МАКСИМУМ(СоответсвиеПодразделений.ПодразделениеОрганизации) КАК ПодразделениеОрг
                  |ИЗ
                  |    РегистрСведений.СоответствиеПодразделенийИПодразделенийОрганизаций КАК СоответсвиеПодразделений
                  |ГДЕ
                  |    СоответсвиеПодразделений.Подразделение = &Подразделение
                  |    И СоответсвиеПодразделений.Организация = &Организация
                  |    И СоответсвиеПодразделений.Организация <> ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
                  |    И СоответсвиеПодразделений.Подразделение <> ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка)
                  |
                  |СГРУППИРОВАТЬ ПО
                  |    СоответсвиеПодразделений.Подразделение,
                  |    СоответсвиеПодразделений.Организация
                  |
                  |ИМЕЮЩИЕ
                  |    КОЛИЧЕСТВО(*) = 1"
30 Индийска праграмиста
 
09.07.10
14:39
типовой код в упп...везде где выбирается подразделениеорганизации из этого регистра, такой запрос
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой