按两个合并的列分组

时间:2020-04-24 13:49:35

标签: sql sql-server tsql join group-by

CREATE TABLE T1 (a int);

CREATE TABLE T2 (a int);

SELECT T1.a , T2.a
FROM T1
JOIN T2 ON T1.a=T2.a
GROUP BY T1.a;

我从此代码中得到一个错误:

消息8120 16级。
选择列表中的“ T2.a”列无效,因为它既不包含在聚合函数中也不在GROUP BY子句中。

由于T1.a和T2.a已加入,我本希望它能工作

3 个答案:

答案 0 :(得分:2)

由于T1.a和T2.a已加入,我本希望它能工作

这是有道理的,但不幸的是:没有。 SQL Server在SELECT子句中看到两个不同的未聚合列,并在GROUP BY子句中也希望它们:

SELECT T1.a, T2.a
FROM T1
JOIN T2 ON T1.a = T2.a
GROUP BY T1.a, T2.a

另一方面,由于正在加入这些列,因此您也知道两者具有相同的值,那么为什么还要在结果集中输出两者?

SELECT T1.a
FROM T1
JOIN T2 ON T1.a = T2.a
GROUP BY T1.a

某些数据库在联接上支持USING语法,当两者相同时,它们会消除列名的歧义-但对SQL Server则不是如此:

SELECT a
FROM T1
JOIN T2 ON USING(a)
GROUP BY a

答案 1 :(得分:1)

由于T1.a和T2.a已加入,我本希望它能工作

SQL标准指出,当同一表的列之间存在依赖关系时,就不需要汇总依赖关系的列。例如,如果您通过主键进行汇总,则无需汇总相同表中的其他列。但是,情况并非如此,因为T2.a在不同的表上。尽管如此,SQL Server仍未实现标准的那部分。

现在,只需稍作更改即可:

SELECT T1.a , T2.a
FROM T1
JOIN T2 ON T1.a=T2.a
GROUP BY T1.a , T2.a;

请参见DB Fiddle上的运行示例。

答案 2 :(得分:0)

只需在t2.a中添加GROUP BY列:

SELECT 
T1.a , T2.a
FROM T1
JOIN T2 ON T1.a= T2.a
GROUP BY T1.a, T2.a;

有必要添加t2.a,因为当SQL Server通过t1.a对同一行进行分组时,它不知道应该为t2.a选择哪一列。