选择列表中的t1.id无效,因为它既不在聚合函数中也不在group by子句中

时间:2018-12-05 07:02:36

标签: sql-server

我有两个表t1和t2, t1的数据如下:

  

Id。名称
    1. Ab
    2. Dc
    3.镉

t2具有给定的数据:

  

Id。收入
  1. 100
  2. 0
  3. 200

我的SQL查询是:

select t1.id ,t1.name,sum(t2.rev)
from t1
inner join t2 on t1.id= t2.id
where t1.id=100 and t2.Revenue <> 0
group by t1.id

3 个答案:

答案 0 :(得分:0)

只需将您要选择的GROUP BY列:

select t1.id ,t1.name,sum(t2.rev)
from t1
inner join t2 on t1.id= t2.id
where t1.id=100 and t2.Revenue <> 0
group by t1.id, t1.name, t2.rev

该错误表示您在SUM字段中有t2.rev-一行,但是SQL Server也有许多行具有计算列,并且它不知道确切选择哪一行

更新:

如果您某列中的一个具有诸如textntextimage之类的类型,则应将其强制转换为NVARCHAR类型:

select t1.id ,t1.name,sum(t2.rev)
from t1
inner join t2 on t1.id= t2.id
where t1.id=100 and t2.Revenue <> 0
group by t1.id, CAST( t1.name AS NVARCHAR(100)), CAST( t2.rev AS  NVARCHAR(100))

更新1:

TEXTNTEXTIMAGE是变量的旧类型,并且其中的类型已弃用。因此,这些类型将由相应的类型VARCHAR(MAX)NVARCHAR(MAX)VARBINARY(MAX)替换或强制转换。

如果您只有TEXT类型的一列,那么仅CAST就是这一列:

select t1.id ,t1.name,sum(t2.rev)
from t1
inner join t2 on t1.id= t2.id
where t1.id=100 and t2.Revenue <> 0
group by t1.id, CAST( t1.name AS NVARCHAR(100)), t2.rev

答案 1 :(得分:0)

如果有的话,导致错误的列将为t1.name1。由于名称完全取决于ID,因此您可以人为地将其添加到group by子句中,而不会损害查询的正确性:

select t1.id ,t1.name,sum(t2.rev)
from t1
inner join t2 on t1.id= t2.id
where t1.id=100 and t2.Revenue <> 0
group by t1.id, t1.name

答案 2 :(得分:0)

如果您要显示任何一列,并且使用了分组依据,那么您还必须将这些列按一个分组

select t1.id ,t1.name,sum(t2.Revenue) from t1
inner join t2 on t1.id= t2.id where t1.id=1 and t2.Revenue <> 0 group by t1.id,t1.Name