如何在MSSQL中使用Group By for Single Column

时间:2015-02-12 04:57:35

标签: mysql sql-server sql-server-2008-r2

我为MySql编写了一个使用LIMIT和GROUP BY关键字的查询。它在MySql上工作正常。查询是:

SELECT 
     tester,
     firstname, 
     COUNT(*) total 
FROM mnrelease_details a LEFT JOIN users b ON tester='guest'  
WHERE a.project='testpro'  
GROUP BY tester ORDER BY total ASC LIMIT 10;

我尝试将其翻译为T-Sql以便在Sql Server上使用。以下是Sql Server的内容:

SELECT TOP 10 
      tester,
      firstname, 
      COUNT(*) total 
FROM mnrelease_details a 
LEFT JOIN users b ON tester='guest'  
WHERE a.project='testpro' 
GROUP BY tester ORDER BY total ASC;

但是,当我尝试在Sql Server上使用它时,我收到此错误:

  

列' users.firstname'在选择列表中无效,因为它是   不包含在聚合函数或GROUP BY子句中。

为什么Sql Server不允许这样做?为什么Sql Server不允许使用单个GROUP BY而不是添加GROUP BY中的所有列?我只想按tester列进行分组,就像我使用MySql一样。

2 个答案:

答案 0 :(得分:2)

如果你有这样的数据怎么办?

tester   firstname
------   ---------
  1      Joe
  2      Bob
  2      Fred 

你期望为测试者2出现哪个名字:鲍勃,还是弗雷德?如果您需要两者,请自行将该列添加到组中,因为firstname列是已定义组的一部分。如果您不在乎,那么只需选择MIN()MAX()这样的聚合函数:它无所谓。如果你关心,那么你需要在查询中构建一些东西,告诉它如何从正确的记录中选择值。

关键是原始查询可能不明确。也许你有数据这样从来没有问题,但查询引擎并不知道这一点。 MySql在这里的行为实际上是错误的行为,并且与ansi sql标准不同(至少对于sql-92和之前的行为)。

答案 1 :(得分:0)

正如错误消息所示,SQL Server对GROUP BY子句上的非聚合字段是严格的,因此它不允许这样做,您需要将firstname字段添加到GROUP BY tester之后的{}假设测试者是唯一的并且每个具有相同的firstname

您可以查看MySQL Handling of GROUP BY以获取有关此问题的更多信息。