Sql 为什么出现“列无效”错误

Sql 为什么出现“列无效”错误,sql,sql-server,Sql,Sql Server,我已将mysql查询转换为SQL Server T-SQL查询,当我运行此查询时,我得到一个错误: 列在select列表中无效,因为它未包含在聚合函数或GROUP BY子句中 这是我的问题,有人能告诉我为什么会出现这个错误吗 SELECT t.id, t.value, t.branch_id, k.name FROM tb_target as t LEFT JOIN tb_keyindicator as k ON k.id = t.keyindicator_i

我已将mysql查询转换为SQL Server T-SQL查询,当我运行此查询时,我得到一个错误:

列在select列表中无效,因为它未包含在聚合函数或GROUP BY子句中

这是我的问题,有人能告诉我为什么会出现这个错误吗

SELECT 
    t.id, t.value, t.branch_id, k.name 
FROM  
    tb_target as t 
LEFT JOIN 
    tb_keyindicator as k ON k.id = t.keyindicator_id 
WHERE 
    t.branch_id IN (241) 
    AND t.period >= '2017-09' 
    AND t.period < '2017-10' 
GROUP BY 
    branch_id;

如果分组正确,则必须应用于以下字段:t.id、t.value、k.name。请参阅其他SO主题中有关类似错误的更多讨论

例如:

SELECT MIN(t.id), MIN(t.value), t.branch_id, MIN(k.name)
FROM tb_target as t 
LEFT JOIN tb_keyindicator as k ON k.id = t.keyindicator_id 
WHERE t.branch_id IN (241) AND t.period >= '2017-09' AND t.period < '2017-10' 
GROUP BY branch_id;

必须在select中包含group by子句中未聚合的所有列。因此,您的查询应该是:

SELECT t.id, t.value, t.branch_id, k.name 
FROM tb_target as t 
LEFT JOIN tb_keyindicator as k ON k.id = t.keyindicator_id 
WHERE t.branch_id IN (241) AND t.period >= '2017-09' AND t.period <  '2017-10' 
GROUP BY t.id, t.value, t.branch_id, k.name;
部分。 所以您的查询应该是这样的

SELECT t.id, t.value, t.branch_id, k.name 
FROM tb_target as t 
LEFT JOIN tb_keyindicator as k ON k.id = t.keyindicator_id 
WHERE t.branch_id IN (241) AND t.period >= '2017-09' AND t.period < '2017-
10'; 

因为错误的确切原因说。。。除非选择列表中的所有列都是a也在GROUP BY中,或者b与聚合函数一起使用,否则不能使用GROUP BY。从逻辑上考虑一下,你怎么能在同一列的同一行上有一个项目列表和摘要?@JacobH或者如果其他列在功能上由group by列之一决定,例如,小学key@NikulPanchal你为什么认为你甚至需要在这里分组?用样本数据和期望的结果问一个新问题。我是@TimBiegeleisen的。你想在这里完成什么?我猜你真正想要的是一个窗口函数。当然,如果你想对选择列表中的所有列进行分组,而不使用任何聚合,切换到DISTINCT并完全删除group by子句更清晰。group by在合成上比在本例中使用DISTINCT更简单。@cdaiga-来自没有group by或DISTINCT的SELECT。要获得不同的值,可以a将单词distinct添加到SELECT子句,或b添加一个GROUP BY子句,再次列出SELECT子句中的所有列。b如何更简单?
group by  
SELECT t.id, t.value, t.branch_id, k.name 
FROM tb_target as t 
LEFT JOIN tb_keyindicator as k ON k.id = t.keyindicator_id 
WHERE t.branch_id IN (241) AND t.period >= '2017-09' AND t.period < '2017-
10';