分组依据和列名中的 SQL 变量

s_t*_*s_t 1 sql-server variables group-by

我正在处理一些非常简单的 SQL 查询,它们是同一个查询的双胞胎,改变了一个字段。这里有一个例子:

select
field1
,sum(field2)
from table
group by field1
Run Code Online (Sandbox Code Playgroud)

而且我必须对三个字段执行此操作,总是对 field2 求和。这意味着例如:

select
field3
,sum(field2)
from table
group by field3
Run Code Online (Sandbox Code Playgroud)

等等。我很快就厌烦了,所以我决定学习一些新东西,应用一个变量,并且只更改一次分组字段的名称。

   declare @field varchar (10);
-- use field1, field3, field4
   set @field = 'field1';

select
@field
,sum(field2)
from table
group by @field
Run Code Online (Sandbox Code Playgroud)

结果是这个错误:

每个 GROUP BY 表达式必须包含至少一列不是外部引用(由谷歌翻译粗略翻译)

好吧,我最终决定面对小组,所以我将其删除:

   declare @field varchar (10);
-- use field1, field3, field4
   set @field = 'field1';

select
@field
from table
Run Code Online (Sandbox Code Playgroud)

结果是一个没有名字的列,在行上有很多field1字作为行号,都等于常量,比如:

no name
field1
field1
field1
....
field1
Run Code Online (Sandbox Code Playgroud)

代替

field1
a
b
c
...
z
Run Code Online (Sandbox Code Playgroud)

所以问题有两个:

  • 如何在查询中添加一个变量作为列名?
  • 如何在一个组中管理它?

提前感谢您的时间!

clo*_*afe 6

这可以动态完成:

declare @sql as nvarchar(max)
declare @field1 varchar (10);
declare @field2 varchar (10);
set @field1 = 'field1';
set @field2 = 'field2';

set @sql = 'select [' + @field1 + '], sum([' + @field2 + ']) from table group by [' + @field1 + ']'
exec(@sql)
Run Code Online (Sandbox Code Playgroud)