【问题标题】:GROUP BY (MySQL vs SQL server)GROUP BY(MySQL 与 SQL 服务器)
【发布时间】:2017-09-28 16:15:24
【问题描述】:

我在使用 GROUP BY 子句时遇到了一些问题。我最初是在 MySQL 中学习 SQL,最近我转移到了 SQL Server。但是,我真的在 GROUP BY 子句上苦苦挣扎。

我习惯于创建查询,例如:

    SELECT Name,Team,Date, SUM(Figure) 
    FROM Table
    GROUP BY Name

这会给我一个结果,例如:

    Name      Team     Date    Figure
    Ben        2       16/09     30
   Simon       4       16/09     55

但是当我在 SQL Server 中编写相同的代码时,我必须对我的 select 子句中的所有列进行 GROUP BY,否则会出错

    SELECT Name,Team,Date, SUM(Figure) 
    FROM Table
    GROUP BY Name,Team,Date

结果:

    Name      Team     Date    Figure
    Ben        2       16/09     10
    Ben        2       19/09     20
   Simon       4       16/09     35
   Simon       4       20/09     20

这是因为它是按名称、团队和日期分组的。

我希望在 SQL Server 中获得类似于我在 MySQL 中的结果,但这似乎是不可能的。有人对这种情况有什么建议吗?

谢谢

【问题讨论】:

  • 您的 MySQL 查询不应该运行。这没有任何意义。 MySQL 如何决定为 Ben 选择 Date 16/09 而不是 19/09?
  • MySQL 只会在严格模式下抱怨,但是是的,第一个查询是错误的。
  • 在除 MySQL 之外的任何其他 dbms 中,您的第一个查询将失败,因为它没有意义。
  • 我明白这没有意义,为什么但 MySQL 曾经让该查询运行
  • @RyanGadsdon 要合并给定列的数据而不专门对其进行分组(如您的情况下的 date),那么您需要告诉 SQL 如何 合并它。正如您在figure 列中看到的那样,SQL 知道它应该如何为每个组组合Figure,因为您使用了 聚合查询 - 您已经说过 “对于每个组, SUM此栏目”。对于日期,您可以使用MIN(Date) 表示最早的日期或使用MAX(Date) 表示最大的日期。

标签: mysql sql sql-server group-by


【解决方案1】:

在 SQL Server 中,当您使用 GROUP BY 时,所有其他涉及的列都需要正确聚合。要实现您的结果,您需要:

    SELECT Name,Team,MIN(Date), SUM(Figure) 
FROM Table
GROUP BY Name,Team

如果您想要更大的日期,请使用 MAX 而不是 MIN。我不熟悉 MySQL,但如果没有适当的聚合,你的结果不应该是可能的。因为 MySql 将如何知道在两者中选择哪个日期,如果个人有不同的Teams,它如何知道选择哪个?

【讨论】:

    【解决方案2】:

    这个查询:

    SELECT Name, Team, Date, SUM(Figure) 
    FROM Table
    GROUP BY Name
    

    没有意义。 TeamDate 使用什么值?

    MySQL 开始鼓励使用ONLY_FULL_GROUP_BY 选项(参见here)的符合ANSI 的行为。 MySQL 文档甚至反对您使用的查询风格:

    禁用ONLY_FULL_GROUP_BY [这将允许您的查询] 很有用主要是当您知道这一点时, 由于数据的某些属性,每个非聚合中的所有值 GROUP BY 中未命名的列对于每个组都是相同的

    在 ANSI 标准 SQL 和几乎所有其他数据库中,您需要围绕所有非聚合列/表达式的聚合函数。比如:

    SELECT Name, MAX(Team) as team, MAX(Date) as last_date, SUM(Figure) 
    FROM Table
    GROUP BY Name;
    

    很遗憾你在学习 MySQL 时养成了坏习惯和不可移植的语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 2010-09-30
      • 2011-06-21
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多