【问题标题】:SQL Having aggregate function?SQL 有聚合函数吗?
【发布时间】:2016-08-15 06:22:12
【问题描述】:

我有学生和评估表。必须返回所有评分的重复次数,但没有 MIN 和 MAX 重复次数等级。

当我运行这个查询时:

SELECT 
     [Grade],
     COUNT([Grade]) AS [Number of repetitions]
     FROM [Test].[dbo].[Evaluation]
     GROUP BY Grade 

我有这个结果,没关系,但是如何在没有 MIN 和 MAX 重复次数的情况下显示此查询。(在这种情况下为 6 - 120 和 10 - 4)

Grade    Number of repetitions
 6              120
 7              35
 8              93
 9              25
10              4 

我用这种方式尝试了 HAVING,但它不起作用。这是 SQL 中的消息:“无法对包含聚合或子查询的表达式执行聚合函数”

SELECT 
     [Grade],
     COUNT([Grade]) AS [Number of repetitions]
     FROM [Test].[dbo].[Evaluation]
     GROUP BY Grade 
     HAVING COUNT([Grade) > (SELECT MIN(COUNT([Grade])) FROM [Test][dbo].[Evaluation] GROUP BY Grade) 
     AND 
     HAVING COUNT([Grade) < (SELECT MAX(COUNT([Grade])) FROM [Test][dbo].[Evaluation] GROUP BY Grade)

非常感谢。

【问题讨论】:

  • 你用的是什么数据库?
  • MS SQL Server 2012

标签: sql sql-server max min having


【解决方案1】:

你不能像这样嵌套聚合函数。您可以使用许多方法来解决此问题。在您的情况下,您可以使用TOPORDER BY 获得极值:

 HAVING COUNT([Grade) > (SELECT TOP 1 COUNT([Grade]) FROM [Test].[dbo].[Evaluation] GROUP BY Grade ORDER BY COUNT([Grade]) ASC ) AND
        COUNT([Grade) < (SELECT TOP 1 COUNT([Grade]) FROM [Test].[dbo].[Evaluation] GROUP BY Grade ORDER BY COUNT([Grade]) DESC)

此外,HAVING 关键字只使用一次。

【讨论】:

    【解决方案2】:
    select TT.* 
    FROM ( SELECT [Grade] 
                , COUNT([Grade]) AS [Number of repetitions]
                , ROW_NUMBER OVER (ORDER BY COUNT([Grade]) desc) rnD 
                , ROW_NUMBER OVER (ORDER BY COUNT([Grade]) asc)  rnA
             FROM [Test].[dbo].[Evaluation]
            GROUP BY Grade 
         ) TT
    WHERE  TT.rnD <> 1 AND TT.rnA <> 1
    

    【讨论】:

    • 你应该给一个复选标记答案。我不在乎你是否给戈登答案。
    【解决方案3】:
    WITH Fact As
    (
    SELECT 
         [Grade],
         COUNT([Grade]) AS [Number of repetitions]
         FROM [Test].[dbo].[Evaluation]
         GROUP BY Grade
    )
    
    SELECT Grade, [Number of repetitions] FROM Fact 
    WHERE 
    [Number of repetitions] NOT IN
    (
    (SELECT MAX([Number of repetitions]) FROM Fact), 
    (SELECT MIN([Number of repetitions]) FROM Fact)
    )
    

    这里我们使用了类似于子查询的公用表表达式的概念。

    【讨论】:

    • 酷!很高兴它有帮助。 :)
    【解决方案4】:

    我通过这种方式解决了这个问题,但 CTE 就是一个很好的例子。谢谢大家。

    SELECT 
          [Grade],
          COUNT([Grade]) AS [Number of repetitions]
          FROM [Test].[dbo].[Evaluation]
          GROUP BY Grade 
          HAVING COUNT([Grade) > (SELECT MIN(COUNT([Grade])) FROM [Test][dbo].[Evaluation] GROUP BY Grade) 
     AND 
          HAVING COUNT([Grade) < (SELECT MAX(COUNT([Grade])) FROM [Test][dbo].[Evaluation] GROUP BY Grade)
    

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 1970-01-01
      • 2013-08-14
      • 2019-07-23
      • 2020-08-05
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多