Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Использование вложенного запроса в HAVING (число прочтений - 7061 )
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Использование вложенного запроса в HAVING
02. Июля 2008 :: 07:22
Печать  
Доброе время суток!
Подскажите, можно ли использовать вложенный запрос в HAVING? Код
SELECT
   $Док.Номенклатура as [Номенклатура $Справочник.Номенклатура]
FROM
   $ДокументСтроки.Реализация as Док
GROUP BY ALL
HAVING Номенклатура IN (SELECT val as [Ном $Справочник.Номенклатура] FROM :Параметр)

выдает: FAILED! ICommandText::Execute(): SQL: Invalid use of subquery
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Использование вложенного запроса в HAVING
Ответ #1 - 02. Июля 2008 :: 07:31
Печать  
А почему это нельзя использовать в WHERE?
  
Наверх
ICQ  
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Использование вложенного запроса в HAVING
Ответ #2 - 02. Июля 2008 :: 07:38
Печать  
Вообще я привел упрощенный пример, реальный запрос слишком большой. Дело в том, что мне нужна группировка с определенным условием. Кстати, можно сделать группировку с суммой в разных полях с разными условиями. Я имею в виду, что у меня будет несколько суммирующихся полей, но для каждого из них будет различное условие. Это нужно для того чтобы иметь возможность получить общее количество по одной группе номенклатуре, по другой, по третьей.....
Например:
SELECT
   $Док.Номенклатура as [Номенклатура $Справочник.Номенклатура],
   SUM($Док.Количество) as Количество1,
   SUM($Док.Количество) as Количество2,
   SUM($Док.Количество) as Количество3
FROM
   $ДокументСтроки.Реализация as Док
GROUP BY $Док.Номенклатура

Нужно чтобы Количество1 суммировалось по одной группе, Количество2 - по другой и т.д.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Использование вложенного запроса в HAVING
Ответ #3 - 02. Июля 2008 :: 07:44
Печать  
Используй CASE
  
Наверх
ICQ  
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Использование вложенного запроса в HAVING
Ответ #4 - 02. Июля 2008 :: 07:54
Печать  
Я наверно что-то не так делаю, код:
SELECT
   $ДокШ.Контрагент as [Контрагент $Справочник.Контрагенты],
  CASE
  WHEN $Док.Номенклатура IN (SELECT Val FROM :Параметр)  THEN SUM($Док.Количество)
  ELSE 0 END as Количество1,   
   SUM($Док.Количество) as Количество2,
   SUM($Док.Количество) as Количество3
FROM
   $ДокументСтроки.Реализация as Док LEFT JOIN $Документ.Реализация as ДокШ ON ДокШ.IDDoc = Док.IDDoc
GROUP BY $ДокШ.Контрагент

выдает:
FAILED! ICommandText::Execute(): Command contains unrecognized phrase/keyword.
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Использование вложенного запроса в HAVING
Ответ #5 - 02. Июля 2008 :: 08:02
Печать  
SELECT Val FROM #Параметр
+
УложитьСписокОбъектов(сз,"#Параметр")
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Использование вложенного запроса в HAVING
Ответ #6 - 02. Июля 2008 :: 08:02
Печать  
Код
Выбрать все
SELECT
   $ДокШ.Контрагент as [Контрагент $Справочник.Контрагенты],
 SUM( CASE
  WHEN $Док.Номенклатура = :Параметр  THEN $Док.Количество
  ELSE 0 END) as Количество1,
   SUM($Док.Количество) as Количество2,
   SUM($Док.Количество) as Количество3
FROM
   $ДокументСтроки.Реализация as Док (nolock)
  LEFT JOIN $Документ.Реализация as ДокШ (nolock) ON ДокШ.IDDoc = Док.IDDoc
GROUP BY $ДокШ.Контрагент
 


Наверное как-то так

Параметр у тебя чему равен?
  
Наверх
ICQ  
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Использование вложенного запроса в HAVING
Ответ #7 - 02. Июля 2008 :: 08:07
Печать  
Nick писал(а) 02. Июля 2008 :: 08:02:
Код
Выбрать все
SELECT  
   $ДокШ.Контрагент as [Контрагент $Справочник.Контрагенты],
 SUM( CASE
  WHEN $Док.Номенклатура = :Параметр  THEN $Док.Количество
  ELSE 0 END) as Количество1,    
   SUM($Док.Количество) as Количество2,
   SUM($Док.Количество) as Количество3
FROM
   $ДокументСтроки.Реализация as Док (nolock)
  LEFT JOIN $Документ.Реализация as ДокШ (nolock) ON ДокШ.IDDoc = Док.IDDoc
GROUP BY $ДокШ.Контрагент
 


Наверное как-то так

Параметр у тебя чему равен?


Выходит ошибка: FAILED! ICommandText::Execute(): Function name is missing ).

База у меня dbf, параметр равен:
     Запрос.УложитьСписокОбъектов(ВыбНом,ИмяТаблицы,ВыбНом.Вид());
     Запрос. УстановитьТекстовыйПараметр ("Параметр", ИмяТаблицы);
Т.е. Параметр содержит имя временной таблицы.
ВыбНом - элемент диалога типа Справочник.Номенклатура

  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Использование вложенного запроса в HAVING
Ответ #8 - 02. Июля 2008 :: 08:10
Печать  
Если база dbf то не скажу Улыбка. Я думал SQL
  
Наверх
ICQ  
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Использование вложенного запроса в HAVING
Ответ #9 - 02. Июля 2008 :: 08:16
Печать  
Вообще ВыбНом в моем случае содержит группу номенклатуры и код:
SELECT val as [Номенклатура $Справочник.Номенклатура] FROM :Параметр
Возвращает перечень номенклатуры, входящий в группу и при использовании с WHERE все работает нормально
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Использование вложенного запроса в HAVING
Ответ #10 - 02. Июля 2008 :: 08:23
Печать  
Я не уверен что CASE поддерживается в Fox'е

точнее в запросах он там вообще не поддерживается.

Через having точно работать не будет. Потому как ты пытаешся ограничить выборку результатом этой выборки Улыбка
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Использование вложенного запроса в HAVING
Ответ #11 - 02. Июля 2008 :: 08:28
Печать  
Nick писал(а) 02. Июля 2008 :: 08:23:
Я не уверен что CASE поддерживается в Fox'е

http://msdn.microsoft.com/en-us/library/8kh5fk26(VS.80).aspx
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Использование вложенного запроса в HAVING
Ответ #12 - 02. Июля 2008 :: 08:37
Печать  
Nick писал(а) 02. Июля 2008 :: 08:23:
Я не уверен что CASE поддерживается в Fox'е

точнее в запросах он там вообще не поддерживается.

Через having точно работать не будет. Потому как ты пытаешся ограничить выборку результатом этой выборки Улыбка

Ранне я действительно привел неудачный пример ($Док.Номенклатура as [Номенклатура $Справочник.Номенклатура]), но дальше я исправил и сейчас простенький запрос выглядит так:
SELECT  
  $ДокШапка.Контрагент as [Контрагент $Справочник.Контрагенты],
  SUM($ДокТаблица.Количество) as Количество
 
FROM
  $ДокументСтроки.Реализация as ДокТаблица
 LEFT JOIN $Документ.Реализация as ДокШапка ON ДокШапка.IDDoc = ДокТаблица.IDDoc
GROUP BY
  $ДокШапка.Контрагент

Т.е. в cумме не должна учитываться номенклатура, не входящая в выбранную на форме отчета группу.
В данном случае я пытаюсь получить общее количество в документах, с группировкой по контрагенту и с отбором по номенклатуре, точнее мне нужно несколько "общих количеств" с разными отборами по номенклатуре.
  
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Использование вложенного запроса в HAVING
Ответ #13 - 02. Июля 2008 :: 08:53
Печать  
Код
SELECT 
   $ДокШапка.Контрагент as [Контрагент $Справочник.Контрагенты],
   ICASE(2>1,2,1)
   
FROM
   $ДокументСтроки.Реализация as ДокТаблица
  LEFT JOIN $Документ.Реализация as ДокШапка ON ДокШапка.IDDoc = ДокТаблица.IDDoc

отрабатывает нормально.

А код:
SELECT 
   $ДокШапка.Контрагент as [Контрагент $Справочник.Контрагенты],
   ICASE($ДокТаблица.Номенклатура IN(SELECT val FROM :Параметр),2,1)
   
FROM
   $ДокументСтроки.Реализация as ДокТаблица
  LEFT JOIN $Документ.Реализация as ДокШапка ON ДокШапка.IDDoc = ДокТаблица.IDDoc

выдает ошибку FAILED! ICommandText::Execute(): Missing comma (,).
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Использование вложенного запроса в HAVING
Ответ #14 - 02. Июля 2008 :: 09:00
Печать  
1. Попробуй вместо ICASE сделать IIF
2. у тебя вот это: "$ДокТаблица.Номенклатура IN(SELECT val FROM :Параметр)" работает?
  
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Использование вложенного запроса в HAVING
Ответ #15 - 02. Июля 2008 :: 09:15
Печать  
IIF выдает: : FAILED! ICommandText::Execute(): Missing comma (,).

Рабочий код:
SELECT  
  $ДокШапка.Контрагент as [Контрагент $Справочник.Контрагенты],  
  SUM($ДокТаблица.Количество)
   
FROM  
  $ДокументСтроки.Реализация as ДокТаблица
 LEFT JOIN $Документ.Реализация as ДокШапка ON ДокШапка.IDDoc = ДокТаблица.IDDoc
WHERE $ДокТаблица.Номенклатура IN(SELECT val FROM :Параметр)
GROUP BY $ДокШапка.Контрагент

Но т.к. мне нужны различные отборы в нескольких группировках, то этот код не подходит
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Использование вложенного запроса в HAVING
Ответ #16 - 02. Июля 2008 :: 09:50
Печать  
Пальцем в небо: может вот это "$ДокТаблица.Номенклатура IN(SELECT val FROM :Параметр)" в скобки надо взять?
  
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Использование вложенного запроса в HAVING
Ответ #17 - 02. Июля 2008 :: 09:54
Печать  
JohnyDeath писал(а) 02. Июля 2008 :: 09:50:
Пальцем в небо: может вот это "$ДокТаблица.Номенклатура IN(SELECT val FROM :Параметр)" в скобки надо взять?


FAILED! ICommandText::Execute(): Function name is missing ).

Скобки я с обеих сторон поставил  Улыбка
Неужели ни укого не возникала потребность в группировках с различными отборами?  Озадачен
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Использование вложенного запроса в HAVING
Ответ #18 - 02. Июля 2008 :: 10:01
Печать  
DrunkProgrammer писал(а) 02. Июля 2008 :: 09:54:
Неужели ни укого не возникала потребность в группировках с различными отборами?  Озадачен

Возникала.
И успешно решалась использованием ICASE.
Попробуй поставить самого модного OLEDB-провайдера.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Использование вложенного запроса в HAVING
Ответ #19 - 02. Июля 2008 :: 10:06
Печать  
Если я использую простое условие, то ICASE работает, например: ICASE(2>1,2,1), а вот с вложенным запросом - лажа.
Ссылку на самого модного OLEDB-провайдера не дадите? Улыбка
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Использование вложенного запроса в HAVING
Ответ #20 - 02. Июля 2008 :: 10:09
Печать  
А что это за конструкция
Код
Выбрать все
SELECT val FROM :Параметр 


???
Имеется ввиду
Код
Выбрать все
SELECT val FROM #Параметр 


?
  
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Использование вложенного запроса в HAVING
Ответ #21 - 02. Июля 2008 :: 10:13
Печать  
У меня база dbf-ная, не нужно заморачиваться на "SELECT val FROM :Параметр", это рабочий код, я уже писал об этом в Ответе #9.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Использование вложенного запроса в HAVING
Ответ #22 - 02. Июля 2008 :: 10:19
Печать  
DrunkProgrammer писал(а) 02. Июля 2008 :: 10:13:
У меня база dbf-ная, не нужно заморачиваться на "SELECT val FROM :Параметр", это рабочий код, я уже писал об этом в Ответе #9.


У меня также база ДБФ, такая конструкция вызывает много вопросов, нельзя ли расшифровать - что такое
Параметр - т.е. чему он равен - Параметр=?
  
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Использование вложенного запроса в HAVING
Ответ #23 - 02. Июля 2008 :: 10:23
Печать  
Вообще это я тоже писал (Ответ #7)

Запрос.УложитьСписокОбъектов(ВыбНом,ИмяТаблицы,ВыбНом.Вид());
Запрос. УстановитьТекстовыйПараметр ("Параметр", ИмяТаблицы);
Т.е. Параметр содержит имя временной таблицы.
ВыбНом - элемент диалога типа Справочник.Номенклатура


SELECT val FROM #Параметр выдает ошибку: не найдена таблица #Параметр.dbf
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Использование вложенного запроса в HAVING
Ответ #24 - 02. Июля 2008 :: 10:36
Печать  
Такой код выполняется?
Код
Выбрать все
SELECT  
   $ДокШапка.Контрагент as [Контрагент $Справочник.Контрагенты],  
   ICASE($ДокТаблица.Номенклатура IN('        1','        2'),2,1) as AAA
  
FROM  
   $ДокументСтроки.Реализация as ДокТаблица
  LEFT JOIN $Документ.Реализация as ДокШапка ON ДокШапка.IDDoc = ДокТаблица.IDDoc
  

  
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Использование вложенного запроса в HAVING
Ответ #25 - 02. Июля 2008 :: 13:34
Печать  
Код
Выбрать все
SELECT
 $ДокШапка.Контрагент as [Контрагент $Справочник.Контрагенты],
 ICASE($ДокТаблица.Номенклатура IN('        1','        2'),2,1) as AAA
FROM
 $Документ.Реализация as ДокШапка
  LEFT JOIN $ДокументСтроки.Реализация as ДокТаблица ON ДокТаблица.IDDoc = ДокШапка.IDDoc 



Выдает ошибку:  FAILED! ICommandText::Execute(): Missing comma (,).
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Использование вложенного запроса в HAVING
Ответ #26 - 02. Июля 2008 :: 14:14
Печать  
DrunkProgrammer писал(а) 02. Июля 2008 :: 08:53:
Код
SELECT  
  $ДокШапка.Контрагент as [Контрагент $Справочник.Контрагенты],
  ICASE(2>1,2,1)
 
FROM
  $ДокументСтроки.Реализация as ДокТаблица
 LEFT JOIN $Документ.Реализация as ДокШапка ON ДокШапка.IDDoc = ДокТаблица.IDDoc

отрабатывает нормально.

А код:
SELECT  
  $ДокШапка.Контрагент as [Контрагент $Справочник.Контрагенты],
  ICASE($ДокТаблица.Номенклатура IN(SELECT val FROM :Параметр),2,1)
 
FROM
  $ДокументСтроки.Реализация as ДокТаблица
 LEFT JOIN $Документ.Реализация as ДокШапка ON ДокШапка.IDDoc = ДокТаблица.IDDoc

выдает ошибку FAILED! ICommandText::Execute(): Missing comma (,).


Похоже ICASE не поддерживает подзапросы ...
Ну используй тогда обычное соединение :
Код
Выбрать все
|SELECT
 |$ДокШапка.Контрагент as [Контрагент $Справочник.Контрагенты],
 |ICASE(ISNULL(ВыбНом .val),1,2) as AAA
|FROM
| $ДокументСтроки.Реализация as ДокТаблица
|  LEFT JOIN $Документ.Реализация as ДокШапка ON ДокШапка.IDDoc = ДокТаблица.IDDoc  
|  LEFT JOIN МояТаблица as ВыбНом ON  $ДокТаблица.Номенклатура=ВыбНом .val
|";  


МояТаблица - имя твоей таблицы

P.S. Проверено - работает
  
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Использование вложенного запроса в HAVING
Ответ #27 - 03. Июля 2008 :: 05:09
Печать  
kiruha писал(а) 02. Июля 2008 :: 14:14:
P.S. Проверено - работает


И у меня работает  Улыбка
Спасибо за помощь!
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать