【问题标题】:SQL error when using Group By: Each GROUP BY expression must contain at least one column that is not an outer reference使用 Group By 时出现 SQL 错误:每个 GROUP BY 表达式必须至少包含一个不是外部引用的列
【发布时间】:2012-07-29 14:47:46
【问题描述】:

在执行我认为是最简单的查询之一时,我遇到了这个错误!我看到其他人在这里也遇到了问题,我查看了我见过的每一个解决方案,但他们的查询涉及更多,所以我很难找出问题所在。我做了一个小虚拟表来说明我的问题。

表名:组测试

id  name
1   Mel
2   Lucy
3   Mandy
4   Mel
5   Mandy
6   Mel

我想知道每个名字出现了多少次,生成如下表格:

3 Mel
2 Mandy
1 Lucy

这是我认为应该有效的查询:

SELECT Count(id), Name
FROM groupbytest
GROUP BY 'Name'

我得到了错误:

每个 GROUP BY 表达式必须至少包含一列 外部参考。

救命!

【问题讨论】:

    标签: sql group-by


    【解决方案1】:

    您在名称字段周围有不需要的引号。

    SELECT Count(id), Name
    FROM grouptest
    GROUP BY Name
    

    根据您的 cmets,您需要 CAST 您的 Name 列:

    SELECT Count(id), Cast(Name as Varchar(max)) Name
    FROM grouptest
    GROUP BY Cast(Name as Varchar(max))
    

    【讨论】:

    • 是的!效果很好:)如果您有时间,您能解释一下为什么有效/有必要吗?也感谢您这么快的回复。
    • @Mel 问题是您试图按不允许的数据类型对数据进行分组。您的表格中有一个 text、ntext 或 image 字段。您需要使用可以分组的数据类型。我使用varchar(max) 将您的数据转换为允许的类型。您也可以将其转换为 nvarchar(max)
    【解决方案2】:

    GROUP BY 上丢失'

    SELECT Count(id), Name 
    FROM groupbytest 
    GROUP BY Name
    

    如果nametext,那么您需要将其转换为VARCHAR,但您可能会截断您的列。

    SELECT Count(id), CAST(Name AS VARCHAR(8000)) AS Name
    FROM groupbytest 
    GROUP BY CAST(Name AS VARCHAR(8000))
    

    【讨论】:

    • 如果我丢失了 's,我会收到以下错误:无法比较或排序 text、ntext 和 image 数据类型,除非使用 IS NULL 或 LIKE 运算符。
    • @Mel - 在这种情况下,消息很清楚。您不能按该数据类型的列进行分组。您可以先尝试投射到VARCHAR
    • @bluefeet - :-) 你今天也打败了我
    【解决方案3】:

    你想要:

    SELECT Count(id), [Name]
    FROM groupbytest 
    GROUP BY [Name]
    

    GROUP BY 'Name' 尝试对字符串“名称”进行分组,而不是 Name 列。

    Name 也可能是保留字,因此它周围有括号,尽管最好不要调用列Name

    【讨论】:

    • 我更改了列名只是为了消除这种可能性,但是添加括号会给我带来与没有 's 时相同的错误 无法比较或排序 text、ntext 和 image 数据类型, 使用 IS NULL 或 LIKE 运算符时除外。
    • 那么你需要将Name列转换为varchar。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    相关资源
    最近更新 更多