1

値がゼロより大きい場合にのみ、行の平均を取りたいです。ただし、次のエラーが表示されます。

「列 'Daily.Rad' は、集計関数または GROUP BY のいずれにも含まれていないため、選択リストでは無効です...」

コード:

SELECT Date,
       AVG([Speed]) as [Speed], 

       CASE WHEN [Rad] > 0.0
            THEN AVG([Rad])
            ELSE 0.0
       END AS [Rad], 

       AVG([Pressure]) as [Pressure], 

       FROM Daily 
WHERE MONTH(Date) = MONTH('08/31/2011')  
GROUP BY Date
4

4 に答える 4

1

Rad負の値を無視して、すべての行の平均が必要な場合は、他の人が正しい答えを出しています。代わりに、正の値のみの平均が必要なRad場合は、自分で計算する必要があります。

SELECT Date,
       AVG([Speed]) as [Speed], 

       SUM(CASE WHEN Rad>0.0 THEN Rad ELSE 0.0 END)
       /SUM(CASE WHEN Rad>0.0 THEN 1 ELSE 0 END) as Rad,

       AVG([Pressure]) as [Pressure], 

       FROM Daily 
WHERE MONTH(Date) = MONTH('08/31/2011')  
GROUP BY Date
于 2012-08-20T06:01:49.250 に答える
1

AVG関数にCASE句を入れる必要があります。

SELECT Date,
       AVG([Speed]) as [Speed], 
       AVG (
       CASE WHEN [Rad] > 0.0
            THEN [Rad]
            ELSE 0.0
       END) AS [Rad], 

       AVG([Pressure]) as [Pressure], 
        Date
       FROM Daily 
WHERE MONTH(Date) = MONTH('08/31/2011')  
GROUP BY Date
于 2012-08-20T03:49:09.410 に答える
0

負の Rad 値を平均から除外しようとしている場合、必要なのは次のとおりだと思います。

SELECT Date,
AVG([Speed]) as [Speed], 

AVG(CASE WHEN [Rad] > 0.0
         THEN [Rad]
         ELSE 0.0
END) AS [Rad], 

AVG([Pressure]) as [Pressure] 

FROM Daily 
WHERE MONTH(Date) = MONTH('08/31/2011')  
GROUP BY Date
于 2012-08-20T03:48:35.490 に答える
0

これにより、負の値が削除され、残りの値が平均化されます。また、where 句を使用すると、パフォーマンスが向上します。

SELECT Date,
       AVG([Speed]) as [Speed], 

       coalesce(nullif( abs([Rad]), -[Rad]), 0) AS [Rad], 
       -- OR
       coalesce(AVG(CASE WHEN [Rad] > 0 THEN [Rad] END), 0) [Rad]

       AVG([Pressure]) as [Pressure], 

       FROM Daily 
WHERE Date >= dateadd(month, datediff(month,  0, '2011-08-31'), 0)
  AND Date <  dateadd(month, datediff(month, -1, '2011-08-31'), 0)
GROUP BY Date
于 2012-08-20T08:24:48.383 に答える