Group by在SQL Server中抛出错误

时间:2017-05-18 05:29:50

标签: c# sql sql-server database

我想按服务名称分组到我的所有记录,我在SQL Server中使用此查询但是它引发了错误

select max(c.service_id) as service_id, a.ser_id, b.UserID, 
    SQRT(POWER(69.1 * ( @latitude - b.Latitude),2) + POWER(69.1 * ( b.Longitude - @longitude ) * COS(b.Longitude / 57.3), 2)) as distance,
    c.service_name
from aspnet_bawe_services a 
left join aspnet_user_account b on a.bawe_id = b.UserID 
left join aspnet_services_app c on a.ser_id = c.service_id 
group by c.service_name

错误

  

Msg 8120,Level 16,State 1,Procedure app_service_list,Line 24
  专栏' aspnet_bawe_services.ser_id'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

3 个答案:

答案 0 :(得分:1)

当你group by时,这意味着你想要压缩“多行,这些行应该按照列中的一个值进行分组,你想要分组。由于所有列(排除你正在分组的列) )必须包含在聚合函数中(如maxsum等),即使它没有必要!因为SQL不知道你可能知道什么:)所以,你必须把a.ser_id在一些聚合函数中。

答案 1 :(得分:1)

您应该对每个不在聚合函数中的列进行分组,或者对这些列使用聚合函数

首先喜欢这个

select  max(c.service_id) as service_id, a.ser_id ,b.UserID,SQRT(POWER(69.1 * ( @latitude - b.Latitude),2) + POWER(69.1 * ( b.Longitude - @longitude ) * COS(b.Longitude / 57.3), 2)) as distance,c.service_name
    from aspnet_bawe_services a 
    left join aspnet_user_account b on a.bawe_id=b.UserID 
    left join aspnet_services_app c on a.ser_id=c.service_id 
    group by c.service_name, a.ser_id,b.UserID,b.Latitude,b.Longitude

或第二次

    select  
    max(c.service_id) as service_id, 
    max(a.ser_id), max(b.UserID), 
    sum(SQRT(POWER(69.1 * ( @latitude - b.Latitude),2) + POWER(69.1 * ( b.Longitude - @longitude ) * COS(b.Longitude / 57.3), 2))) as distance,
    c.service_name
from 
    aspnet_bawe_services a 
left join 
    aspnet_user_account b on a.bawe_id = b.UserID 
left join 
    aspnet_services_app c on a.ser_id = c.service_id 
group by 
    c.service_name

答案 2 :(得分:0)

如果您希望使用group by那么所有选定的列都应该在聚合函数中,如果您不想在这些列上应用任何聚合函数,那么它们必须在group by子句中。 在你的情况下,你应该尝试:

select  max(c.service_id) as service_id, a.ser_id ,b.UserID,SQRT(POWER(69.1 * ( @latitude - b.Latitude),2) + POWER(69.1 * ( b.Longitude - @longitude ) * COS(b.Longitude / 57.3), 2)) as distance,c.service_name
from aspnet_bawe_services a 
left join aspnet_user_account b on a.bawe_id=b.UserID 
left join aspnet_services_app c on a.ser_id=c.service_id 
group by c.service_name,**a.ser_id,b.UserID**

或者你可以删除 a.ser_id,b.UserID 如果你不想要这个

或者如果你想要这些列,那么你必须在a.ser_id,b.UserID上应用group by或任何聚合函数,否则它们将无法工作,因为你的服务器在严格模式下查看。因此,如果您想按原样运行查询,则必须在数据库上禁用严格模式。如果您使用的是MYSQl,则此链接可能会帮助您https://www.liquidweb.com/kb/how-to-disable-mysql-strict-mode/