1

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

日期 VisitCount(COUNT) TotalBilling(SUM)
2010 年 1 月 1 日 234 15765.21
2010 年 1 月 2 日 321 23146.27
10 年 1 月 3 日 289 19436.51

上面的简化 SQL 是:

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

FROM Visits 

GROUP BY VisitDate

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

日期 VisitCount(COUNT) TotalBilling(SUM) AvgVisits AvgBilling
2010 年 1 月 1 日 234 15765.21 281.3 19449.33
2010 年 1 月 2 日 321 23146.27 281.3 19449.33
2010 年 1 月 3 日 289 19436.51 281.3 19449.33

SQL 不允许将聚合函数应用于另一个聚合函数或子查询,因此我能想到的唯一方法是使用临时表或遍历结果集并手动计算值。有没有什么方法可以在 MSSQL2008 中做到这一点而无需临时表或手动计算?

4

3 回答 3

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

于 2010-06-21T21:52:37.937 回答
1

类似的东西

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

FROM Visits 
GROUP BY VisitDate) as a
于 2010-06-21T22:03:00.033 回答
0

好吧,如果您特别想避免使用临时表,我相信可以使用Common Table Expression来完成。

于 2010-06-21T21:52:50.120 回答