无法对包含聚合或子查询的表达式执行聚合函数

时间:2017-04-28 14:34:34

标签: sql-server sql-server-2008

我的表格是这样创建的:

create table ##temp2(min_col1_value varchar (100))
create table ##temp1(max_col1_value varchar (100))

该表的值如下:

   min_col1_value
-------------------
       1
       0
       10
       1

我试图获得最小长度值的频率计数"期待结果为3。

最大的另一个例子是:

 max_col1_value
-------------------
       1000
       1234
       10
       1111
       123
       2345

我试图获得最大长度值的频率计数"期待结果为4。

当我运行此查询时:

  select count(min(len(convert(int,min_col1_value)))) from ##temp2 group 
  by min_col1_value

select count(max(len(convert(int,max_col1_value)))) from ##temp1 group by 
max_col1_value

获取错误:无法对包含聚合或子查询的表达式执行聚合函数。

如何获得理想的结果?

2 个答案:

答案 0 :(得分:1)

您不能在同一个SELECT语句中聚合两次,即使可以,您的min(len())也会返回一个值:2,因为您的最小字段长度#temp22。计数只会给你1,因为只有一个值可以计算。

您想知道有多少字段具有最小长度的数量,因此您需要以下内容:

SELECT count(*)
FROM #temp2
WHERE len(min_col1_value) IN (SELECT min(len(min_col1_value)) FROM #temp1)

WHERE子句说,只计算#temp2中的值,其长度等于#temp2中所有值的最小长度。这应该根据您的示例数据返回3

相同的逻辑可以应用于最小或最大的表格。

答案 1 :(得分:1)

这可以得到你想要的结果:

SELECT COUNT(*)
FROM ##temp2
WHERE LEN(min_col1_value) = 
(
    SELECT MIN(LEN(min_col1_value)) 
    FROM ##temp2
)

SELECT COUNT(*)
FROM ##temp1
WHERE LEN(max_col1_value) = 
(
    SELECT MAX(LEN(max_col1_value)) 
    FROM ##temp1
)