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

Sql server 将聚合函数应用于另一个聚合函数的SQL查询,sql-server,sql-server-2008,aggregate-functions,Sql Server,Sql Server 2008,Aggregate Functions,我有几个查询结果,它们使用一个或多个聚合函数和一个日期分组依据,因此它们看起来像这样: Date VisitCount(COUNT) TotalBilling(SUM) 1/1/10 234 15765.21 1/2/10 321 23146.27 1/3/10 289 19436.51 我想要的是一种将聚合函数(如AVG)应用于结果集中的一列的方法。例如,我想向结果集中添

我有几个查询结果,它们使用一个或多个聚合函数和一个日期分组依据,因此它们看起来像这样:

Date VisitCount(COUNT) TotalBilling(SUM) 1/1/10 234 15765.21 1/2/10 321 23146.27 1/3/10 289 19436.51 我想要的是一种将聚合函数(如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中,我是否可以在没有临时表或手动计算的情况下实现这一点

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更具表现力


您可以通过子查询实现同样的效果,我只是觉得CTE更具表现力。

如果您特别想避免使用临时表,我相信可以使用。

如果您特别想避免使用临时表,我相信可以使用类似于

select *,avg(visitcount) over(),
avg(totalbilling) over()
from(
SELECT 
  VisitDate, 
  COUNT(*) AS VisitCount, 
  SUM(BilledAmount) AS TotalBilling 

FROM Visits 
GROUP BY VisitDate) as a
类似于

select *,avg(visitcount) over(),
avg(totalbilling) over()
from(
SELECT 
  VisitDate, 
  COUNT(*) AS VisitCount, 
  SUM(BilledAmount) AS TotalBilling 

FROM Visits 
GROUP BY VisitDate) as a

如果没有一张临时桌子,我认为这没有任何意义。您必须执行两次查询:一次计算所有列的聚合,然后再次转储一个表,并将聚合附加到末尾。我的意思是,如果不查看第一个表的每一行,就无法计算这些聚合……如果没有临时表,我认为这没有任何意义。您必须执行两次查询:一次计算所有列的聚合,然后再次转储一个表,并将聚合附加到末尾。我的意思是,如果不查看第一个表的每一行,就无法计算这些聚合…这正是我所需要的。谢谢。这正是我需要的。非常感谢。