【问题标题】:Can't perform an aggregate function on an expression containing an aggregate or a subquery无法对包含聚合或子查询的表达式执行聚合函数
【发布时间】:2017-04-28 22:46:14
【问题描述】:

我的表是这样创建的:

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

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

如何得到想要的结果?

【问题讨论】:

  • len(convert(int,min_col1_value)) 没有多大意义。你想要的结果是什么样的?
  • 我应该将计数设为 3(最小值)并计数为 4(最大值)。基本上想知道最小长度的字符重复了多少次。以及,在列中重复最大字符长度的次数。

标签: sql-server sql-server-2008


【解决方案1】:

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

您想要计算有多少字段具有该最小长度,因此您需要以下内容:

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

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

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

【讨论】:

    【解决方案2】:

    这应该会得到你想要的结果:

    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
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多