【问题标题】:Is it possible to use Aggregate function in a Select statment without using Group By clause?是否可以在不使用 Group By 子句的情况下在 Select 语句中使用 Aggregate 函数?
【发布时间】:2011-09-21 23:20:09
【问题描述】:

到目前为止,我已经编写了聚合函数,后跟 Group By 子句,以根据 SUM、AVG 和其他聚合函数查找值。我对 Group By 子句有点困惑。 当我们使用聚合函数时,我需要在 Group By 子句中指定哪些列。 否则有什么方法可以在不使用 Group By 子句的情况下使用聚合函数。

【问题讨论】:

    标签: sql sql-server sql-server-2005 group-by aggregate-functions


    【解决方案1】:

    您在聚合函数中省略了 SELECT 中的列,所有其他列应存在于 GROUP BY 子句中,以逗号分隔。

    只要您在 SELECT 语句中只有聚合值,您就可以使用聚合进行查询而没有分组依据

    【讨论】:

      【解决方案2】:

      SELECT 子句中没有聚合的所有列都需要在 GROUP BY 中

      好:

      SELECT col1, col2, col3, MAX(col4)
      ...
      GROUP BY col1, col2, col3
      

      也不错:

      SELECT col1, col2, col3, MAX(col4)
      ...
      GROUP BY col1, col2, col3, col5, col6
      

      没有其他列 = 不需要 GROUP BY

      SELECT MAX(col4)
      ...
      

      不起作用:

      SELECT col1, col2, col3, MAX(col4)
      ...
      GROUP BY col1, col2
      

      毫无意义:

      SELECT col1, col2, col3, MAX(col4)
      ...
      GROUP BY col1, col2, col3, MAX(col4)
      

      在没有 GROUP BY 的情况下与其他列进行聚合(MAX 等)是没有意义的,因为查询变得不明确。

      【讨论】:

      • 所以在 Group By 子句中,我们需要指定我们选择的所有列,我们可能不包括聚合列。这是您指定的。我说的对吗?
      • 正确,但不应包含聚合列。这也没有意义
      • 有时可以只按给定表的行 ID 分组——在 PostgreSQL 9.5 中通过反复试验发现。
      • @sventechie:PG 比其他人更尊重 SQL 标准,它说(我认为!)GROUP BY <primary key> 应该与 GROUP BY <primary key>, <nonkey column1>, <nonkey column2> 相同。也就是说,PK 已经是唯一的,因此可以忽略非键列
      【解决方案3】:

      您必须按具有聚合函数的列进行分组。

      如果选择的所有列都应用了聚合函数,则可以避免使用 group by 子句。

      【讨论】:

        【解决方案4】:

        是的,您可以使用没有 GROUP BY 的聚合:

        SELECT SUM(col) FROM tbl;
        

        这将只返回一行 - tbl 中所有行的“col”列的总和(不包括空值)。

        【讨论】:

          【解决方案5】:

          你可以在 TSQL 中使用 Select AGG() OVER()

          SELECT *,
          SUM(Value) OVER()
          FROM Table
          

          如果要分组,还有其他选项,例如 Partition By:

          SELECT *,
          SUM(Value) OVER(PARTITION By ParentId)
          FROM Table
          

          http://msdn.microsoft.com/en-us/library/ms189461.aspx

          【讨论】:

          • +1 注意 GROUP BY 会将行折叠到分组中,PARTITION BY 将保留所有行。不过还是有用的
          • 感觉超级hacky,但它适用于我的情况。似乎也没有过度优化,因为我的查询速度明显减慢。
          • 这是问题精神的最佳答案。
          • 注意:我们称之为窗口函数
          【解决方案6】:

          Aggregate 函数中不存在的列应该出现在 group by 子句中:

          Select 
          Min(col1), 
          Avg(col2), 
          sum(col3) 
          from table
          

          那么我们不需要 group by 子句,但是如果聚合函数中不存在某些列,那么您必须对该列使用 group by。

          Select 
          col1, 
          col2, 
          sum(col3) 
          from  table 
          group by col1,col2
          

          那么我们必须对列 col1 和 col2 使用 group by

          【讨论】:

            【解决方案7】:

            是的,如果没有聚合函数,我们可以按列使用分组,但这将是一个独特的函数。

            select <column name> from <table name> group by <column name> 
            

            给定表EMP

            select * from EMP
            

            输出:

            7369    SMITH   CLERK       7902
            7499    ALLEN   SALESMAN    7698
            7521    WARD    SALESMAN    7698
            7566    JONES   MANAGER     7839
            

            添加group by

            select job from EMP group by job
            

            输出:

            CLERK
            SALESMAN
            MANAGER
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-11-15
              • 1970-01-01
              • 2021-03-26
              • 1970-01-01
              • 1970-01-01
              • 2018-10-12
              相关资源
              最近更新 更多