1

1 つ以上の集計関数と日付 GROUP-BY を使用するクエリ結果がいくつかあるため、次のようになります。

日付 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 などの集計関数を結果セットの列の 1 つに適用する方法です。たとえば、次のように "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 でこれを行う方法はありますか?

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 に答える