Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Использование вложенного запроса в HAVING (число прочтений - 6938 )
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 записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать