2012-03-22 11 views
0

SQLの比率の平均を取得しようとしています。SQLの平均除算

私のテーブルには、次のようになります。

T_TOTAL | NUM_ASSETS 
---------------------- 
    32 |  8 
    20 |  4 
    24 |  4 

そして私が後だという値はのようにです:

T_TOTAL | NUM_ASSETS | T_TOTAL/NUM_ASSETS 
--------------------------------------------- 
    32 |  8  |   4 
    20 |  4  |   5 
    24 |  4  |   6 
          ------------------- 
          AVG = 5 

これまでのところ、私はこれを持っているが、それは働いていない:

SELECT T_TOTAL As Time, NUM_ASSETS As Assets, 
Time/Assets As TimePerAsset, AVG(TimePerAsset) As Result 
FROM MATCHES 

+0

」の定義しますうまくいきません "。 – dan04

+0

@ dan04エイリアスに「無効な列名」エラーが表示される – greener

答えて

2
select avg(t_total/num_assets) from matches 

を試すことができますし、num_assetsに0を持っている場合、あなたは次のように0除算を避けることができます。

select avg(t_total/nullif(num_assets, 0)) from matches 
+0

0で除算すると違法であるため、エラーが発生します –

+0

0で除算することを含めて完全に処理されました。 – greener

+0

@a_horse_with_no_nameこれは、私がそれを処理するために2番目のSQLを投稿した理由です。 –

0

あなたはこの

SELECT T_TOTAL As Time, NUM_ASSETS As Assets, 
case when Assets <> 0 then Time/Assets end As TimePerAsset, AVG(case when Assets <> 0 then Time/Assets end) As Result 
FROM MATCHES 
+0

解決策を試しましたが、「列名が無効です」というエラーが表示されました – greener

1
SELECT M.Time, M.Assets, M.TimePerAsset, Avg(M.TimePerAsset) as AvgTimePerAsset 
FROM 
(
    SELECT T_TOTAL As TotalTime 
     , NUM_ASSETS As Assets 
     , CASE WHEN NUM_ASSETS <> 0 THEN T_TOTAL/NUM_ASSETS ELSE NULL END As TimePerAsset 
    FROM Matches 
) M 
GROUP BY M.Time, M.Assets, M.TimePerAsset 
+0

0で割ることの意味を理解しています"無効な列名 'Assets'"です。しかしそれは単なる別名ですか? – greener

+0

あなたは正しいです、私はその場所でエイリアスを使用しないように私の答えを更新しました。 – Taryn

3
SELECT t.*, 
     Result = AVG(TimePerAsset) 
    FROM (
      SELECT [Time] = T_TOTAL, 
        [Assets] = NUM_ASSETS, 
        [TimePerAsset] = CASE WHEN NUM_ASSETS <> 0 
              THEN T_TOTAL/NUM_ASSETS 
              ELSE NULL 
            END 
       FROM MATCHES 
     ) t 
+0

はあなたの解決策を試しましたが、 "Time'がMSSQLのキーワードであるため、エラー"無効な列名 'Time' " – greener

+0

@greener、thatsが返されました。回答が更新されました。 – Akhil

+0

ありがとう!しかし、今私はアセットで同じエラーが発生しますか? – greener