Sql 为什么我们需要将所有字段添加到GROUPBY子句?
我有一个表Sql 为什么我们需要将所有字段添加到GROUPBY子句?,sql,sql-server,group-by,Sql,Sql Server,Group By,我有一个表test1和一个视图view1,我想知道为什么会得到这样的结果: CREATE TABLE test1 ( A_ VARCHAR(10), B_ VARCHAR(10), C_ VARCHAR(10), D_ VARCHAR(10) ); CREATE VIEW view1 AS SELECT CASE WHEN D_ in ('false') THEN LEFT(A_, CHARINDEX('(', A_) -1)
test1
和一个视图view1
,我想知道为什么会得到这样的结果:
CREATE TABLE test1 (
A_ VARCHAR(10),
B_ VARCHAR(10),
C_ VARCHAR(10),
D_ VARCHAR(10)
);
CREATE VIEW view1 AS
SELECT
CASE
WHEN D_ in ('false') THEN LEFT(A_, CHARINDEX('(', A_) -1)
ELSE D_
END AS D,
MIN(B_) B,
CASE
WHEN C_ IS NOT NULL THEN '0'
ELSE C_
END AS C
FROM test1
GROUP BY
D_,
B_,
C_;
列“test1.A”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中
我知道我必须在groupby
部分中添加A
,但是为什么它不会显示在视图中?
另外,如果我删除
GROUP BY
子句,为什么会出现相同的错误?因为\u A
用于左侧(A_,CHARINDEX('(',A_)-1)
您必须将其包含在分组依据中。
的情况并不重要。我们不必将属性添加到分组依据中的唯一情况是当属性是聚合函数的一部分时。因为\u A
用于左侧(A_u,CHARINDEX('(',A_u)-1)
您必须将其包括在分组依据中。
情况下不重要。
我们不必将属性添加到分组依据中的唯一情况是当属性是聚合函数的一部分时。执行分组依据A、C、D
。一般分组依据规则规定:如果指定了GROUP BY子句,则SELECT列表中的每个列引用必须标识一个分组列或是集合函数的参数。“不,不要按a、C、D进行分组,因为它们是别名,所以会输出错误。按a、C、D进行分组。常规分组规则是:如果指定了GROUP BY子句,则SELECT列表中的每个列引用必须标识分组列或是集合函数的参数。"不,不要按A、C、D分组,因为它们是别名,所以会输出错误。只是觉得这很奇怪,我们不得不添加它。我知道它正在使用,但这不是一个有用的信息;
的输出根本不会显示A.
。@begreen你必须意识到可能有很多对于一个D\u,B\u,C\u
组合,行中有许多不同的A\u
值。问题是:在这种情况下应该使用哪个值?好吧,也许我被我的真实代码蒙蔽了双眼,因为那里只有一个A\u
。但是,如果我删除GROUP by
,那么为什么会出现相同的错误呢?@BeGreen一旦你有了聚合乐趣在SELECT
后面执行操作,在聚合函数之外只能有groupby
后面的属性。好的,谢谢你,回答清楚。我们发现这很奇怪,必须添加它。我知道它正在被使用,但它不是一个有用的信息这SELECT*FROM view;
的输出不会显示A_
。@begreen你必须意识到,对于D,B,C_
的一个组合,可以有许多行具有许多不同的A_
值。问题是:在这种情况下应该使用哪一个值?好吧,也许我被我的真实代码蒙蔽了,其中只能有一个A_
。但是,如果这样,为什么我会得到同样的错误呢我删除了分组依据
?@BeGreen一旦您在选择
之后有了一个聚合函数,那么在聚合函数之外只能有分组依据
后面的属性。好的,谢谢,回答清楚。