【问题标题】:How to Use Group By for Single Column in MSSQL如何在 MSSQL 中对单个列使用 Group By
【发布时间】:2015-02-12 04:57:35
【问题描述】:

我有一个为 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 所做的那样。

【问题讨论】:

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


    【解决方案1】:

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

    测试人员名字 ------ --------- 1乔 2鲍勃 2弗雷德

    您希望哪个名字出现在测试人员 2 中:Bob 还是 Fred?如果两者都需要,请自行将该列添加到组中,因为 firstname 列是您定义的组的一部分。如果您不在乎,那么只需选择像 MIN()MAX() 这样的聚合函数:没关系。如果您确实关心,那么您需要在查询中构建一些内容来告诉它如何从正确的记录中选择值。

    关键是原始查询可能不明确。也许您的数据从来都不是问题,但查询引擎事先并不知道这一点。 MySql 在这里的行为实际上是错误的行为,并且背离了 ansi sql 标准(至少,对于 sql-92 及之前的版本)。

    【讨论】:

      【解决方案2】:

      正如错误消息所暗示的,SQL Server 对 GROUP BY 子句上的非聚合字段是严格的,所以它不允许这样做,您需要在 @ 之后将 firstname 字段添加到 GROUP BY 子句987654324@ 假设测试人员是唯一的并且每个人都有相同的firstname

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-03
        相关资源
        最近更新 更多