SQL-запрос, который применяет агрегатную функцию к другой агрегатной функции - PullRequest
1 голос
/ 22 июня 2010

У меня есть несколько результатов запроса, которые используют одну или несколько статистических функций и дату 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 голосов
/ 22 июня 2010
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 более выразительными.

1 голос
/ 22 июня 2010

Нечто похожее на

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

FROM Visits 
GROUP BY VisitDate) as a
0 голосов
/ 22 июня 2010

Ну, если вы специально пытаетесь избежать использования временных таблиц, я думаю, что это можно сделать с помощью Общего выражения таблицы .

...