如何在sql中使用“HAVING”和“ORDER BY”子句

时间:2010-08-31 10:32:45

标签: c# asp.net mysql sql-server-2005

我有sql查询如下所示sql server说它们是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 个答案:

答案 0 :(得分:8)

在此使用where代替having

having可用于缩小总值的条件 where对于缩小未汇总数据的条件非常有用。

<强>更新
SQL Server不是MySQL,它可以在一个...

  1. 可以在另一个
  2. 上工作
  3. 可能需要稍微调整一下 工作
  4. 可能需要完全 在它工作之前重新加入。
  5. 这应该是你需要的

    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  ) ) ) ;  
    

答案 1 :(得分:2)

每个人都已经提到HAVING用于聚合数据,例如SUM和MIN,你可以将这两个条件放在你的WHERE子句中。

对于它的价值(我现在无法测试)并希望解决您的实际问题,我的经验是您不能在HAVING子句中使用列别名,并且必须明确重写该列的等式而不是别名。

有关详细信息,请参阅this question

答案 2 :(得分:2)

HAVING通常与GROUP BY语句一起使用。 HAVING就像结果组的WHERE一样。

答案 3 :(得分:1)

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  ;