首页 文章

将聚合函数应用于另一个聚合函数的SQL查询

提问于
浏览
1

我有几个查询结果使用一个或多个聚合函数和日期GROUP-BY,所以它们看起来像这样:

Date     VisitCount(COUNT)  TotalBilling(SUM)
1/1/10     234                15765.21
1/2/10     321                23146.27
1/3/10     289                19436.51

上面的简化SQL是:

SELECT 
  VisitDate, 
  COUNT(*) AS VisitCount, 
  SUM(BilledAmount) AS TotalBilling 

FROM Visits 

GROUP BY VisitDate

我想要的是一种将聚合函数(如AVG)应用于结果集中的一列的方法 . 例如,我想将“AvgVisits”和“AvgBilling”列添加到结果集中,如下所示:

Date     VisitCount(COUNT)  TotalBilling(SUM)  AvgVisits  AvgBilling
1/1/10     234                15765.21          281.3      19449.33
1/2/10     321                23146.27          281.3      19449.33
1/3/10     289                19436.51          281.3      19449.33

SQL不允许将聚合函数应用于另一个聚合函数或子查询,因此我能想到的唯一方法是使用临时表或迭代结果集并手动计算值 . 有没有办法在没有临时表或手动计算的情况下在MSSQL2008中执行此操作?

3 回答

  • 5

    好吧,如果你特意试图避免使用临时表,我相信它可以使用Common Table Expression来完成 .

  • 0

    类似的东西

    select *,avg(visitcount) over(),
    avg(totalbilling) over()
    from(
    SELECT 
      VisitDate, 
      COUNT(*) AS VisitCount, 
      SUM(BilledAmount) AS TotalBilling 
    
    FROM Visits 
    GROUP BY VisitDate) as a
    
  • 1
    with cteGrouped as (
    SELECT 
      VisitDate, 
      COUNT(*) AS VisitCount, 
      SUM(BilledAmount) AS TotalBilling
    FROM Visits 
    GROUP BY VisitDate),
    cteTotal as ( 
    SELECT COUNT(*)/COUNT(DISTINCT VisitDate) as AvgVisits,
         SUM(BilledAmount)/COUNT(DISTINCT VisitDate) as AvgBilling
    FROM Visits)
    SELECT *
    FROM cteGrouped
    CROSS JOIN cteTotal;
    

    您可以通过子查询实现相同,我只是发现CTE更具表现力 .

相关问题