Как использовать предложения "HAVING" и "ORDER BY" в SQL - PullRequest
2 голосов
/ 31 августа 2010

У меня sql-запрос, как показано ниже, сервер sql говорит, что это ошибка в HAVING, а ORDER bY - это любая ошибка с синтаксисом около HAVING и ORDER BY, может кто-нибудь помочь.

SELECT Id,
       Name1,
       ZipCode,
       StreetName,
       StreetNumber,
       State1,
       Lat,
       Lng,
       Keyword,
       ( 6371 * ACOS( COS( (12.925432/57.2958) ) * COS(  (Lat/57.2958)  ) * COS( ( Lng/57.2958 ) - (77.5940171/57.2958) ) + SIN( 12.925432/57.2958 ) * SIN(  Lat/57.2958  ) ) ) AS distance 
  FROM Business_Details 
  HAVING (distance < 1.5) and (Keyword like '%plumber%')  
  ORDER BY distance  ; 

Ответы [ 4 ]

8 голосов
/ 31 августа 2010

Используйте where здесь вместо having.

having полезно для сужения условий для агрегированных значений.
where полезно для сужения условий для неагрегированных данных.

Обновление
SQL Server не является MySQL, что работает на одном ...

  1. Может просто работать на другом
  2. Может потребоваться небольшая настройка для работы
  3. Может потребоваться полная переработка, прежде чем он заработает.

Это должно быть то, что вам нужно

SELECT Id, 
       Name1, 
       ZipCode, 
       StreetName, 
       StreetNumber, 
       State1, 
       Lat, 
       Lng, 
       Keyword, 
       ( 6371 * ACOS( COS( (12.925432/57.2958) ) * COS(  (Lat/57.2958)  ) * COS( ( Lng/57.2958 ) - (77.5940171/57.2958) ) + SIN( 12.925432/57.2958 ) * SIN(  Lat/57.2958  ) ) ) AS distance  
  FROM Business_Details  
  where (Keyword like '%plumber%')  
  and ( 6371 * ACOS( COS( (12.925432/57.2958) ) * COS(  (Lat/57.2958)  ) * COS( ( Lng/57.2958 ) - (77.5940171/57.2958) ) + SIN( 12.925432/57.2958 ) * SIN(  Lat/57.2958  ) ) ) < 1.5
  ORDER BY ( 6371 * ACOS( COS( (12.925432/57.2958) ) * COS(  (Lat/57.2958)  ) * COS( ( Lng/57.2958 ) - (77.5940171/57.2958) ) + SIN( 12.925432/57.2958 ) * SIN(  Lat/57.2958  ) ) ) ;  
2 голосов
/ 31 августа 2010

HAVING обычно используется вместе с оператором GROUP BY. Иметь, как ГДЕ для результирующих групп.

2 голосов
/ 31 августа 2010

Все уже упоминали, что HAVING для агрегированных данных, таких как SUM и MIN, и вы можете поместить эти два условия в ваше предложение WHERE.

Для чего это стоит (я не могу проверитьпрямо сейчас) и я надеюсь, что для решения вашего фактического вопроса, по моему опыту, вы не можете использовать псевдоним столбца в предложении HAVING и должны явно переписать уравнение для столбца вместо псевдонима.

См. этот вопрос для более подробной информации.

1 голос
/ 31 августа 2010
SELECT * from   
 (SELECT Id,
   Name1,
   ZipCode,
   StreetName,
   StreetNumber,
   State1,
   Lat,
   Lng,
   Keyword,
   ( 6371 * ACOS( COS( (12.925432/57.2958) ) * COS(  (Lat/57.2958)  ) * COS( ( Lng/57.2958 ) - (77.5940171/57.2958) ) + SIN( 12.925432/57.2958 ) * SIN(  Lat/57.2958  ) ) ) AS distance 
FROM Business_Details 
)
WHERE (distance < 1.5) and (Keyword like '%plumber%')  
 ORDER BY distance  ; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...