为什么我们需要将所有字段添加到GROUP BY子句?

时间:2017-10-03 09:45:28

标签: 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)
        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子句中。

我知道我必须在A_部分添加GROUP BY,但为什么不会在视图中显示? 另外,如果删除GROUP BY子句,为什么会出现同样的错误?

1 个答案:

答案 0 :(得分:2)

由于_A中使用LEFT(A_, CHARINDEX('(', A_) -1),您必须将其包含在GROUP BY中。它在CASE中并不重要。我们不必将属性添加到GROUP BY的唯一情况是属性是聚合函数的一部分。