Tsql 在函数T-sql中使用变量每个GROUP BY表达式必须至少包含一个非外部引用的列

Tsql 在函数T-sql中使用变量每个GROUP BY表达式必须至少包含一个非外部引用的列,tsql,sql-server-2012,Tsql,Sql Server 2012,大家好,我有一张名为matale的桌子(nom varchar,prenom varchar,department(varchar)) 我想要的是每列有一个表,表中每列的不同值都有这个值的出现次数。 为此,我有以下功能: create function countnumberoccurenceofcolumn( @column varchar(20),@limit int ) returns @tab table ( modalite varchar(20) , occurence int)

大家好,我有一张名为matale的桌子(nom varchar,prenom varchar,department(varchar)) 我想要的是每列有一个表,表中每列的不同值都有这个值的出现次数。 为此,我有以下功能:

create function countnumberoccurenceofcolumn( @column varchar(20),@limit int )
 returns @tab table ( modalite varchar(20) , occurence int)
as
begin
Insert into @tab select  @column,count(@column) as occurence from matable group  by     @column,departement
return 
end
go
但我有一个错误:

Each GROUP BY expression must contain at least one column that is not an outer reference.

谢谢

您没有按任何内容进行分组-您的group by语句需要包含一个列名称,该列名称不是数学运算符,但在选择列表中。一、 e:

select department, count(department) as occurence 
from matable group by departement
分组方式允许您收集项目并在数学运算符下将它们组合在一起。例如,给定“MyTable”中的数据:

然后运行这个查询

SELECT Value, COUNT(*) from MyTable GROUP BY Value
将导致:

Hello    2
Goodbye  1
您的查询除了COUNT运算符外不包含任何内容。因此,要么不需要GROUPBY,要么需要在SELECT和GROUP语句中包含另一列

编辑:

如果需要动态执行此操作,则需要构建一个字符串并使用动态sql执行它。因此:

declare @sql nvarchar(999)

set @sql = 'Insert into @tab select ' + @column + ', count(' + @column + ') as occurence from    
matable group by ' +  @column + ',departement'

exec @sql

然而,我不相信你的查询(或你的函数)会像写的那样工作。希望这是足够的信息,可以帮助您顺利完成任务。

谢谢Matt,但我无法通过向函数传递参数的列名动态分组感谢使用过程和动态参数解决了我的问题
declare @sql nvarchar(999)

set @sql = 'Insert into @tab select ' + @column + ', count(' + @column + ') as occurence from    
matable group by ' +  @column + ',departement'

exec @sql