我想按服务名称分组到我的所有记录,我在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子句中。
答案 0 :(得分:1)
当你group by
时,这意味着你想要压缩“多行,这些行应该按照列中的一个值进行分组,你想要分组。由于所有列(排除你正在分组的列) )必须包含在聚合函数中(如max
或sum
等),即使它没有必要!因为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/