-1

計算されたSUM値の平均値を取得したいのですが、「集計またはサブクエリを含む式で集計関数を実行できません」というエラーが表示されます。

サンプルコード:

SELECT 
T.ReferenceNo,
Parts = ROUND(SUM(
    CASE
        WHEN T.AccountCode in ('value1', 'value2') THEN
            T.Amount
    END),2)
Labor = ROUND(SUM(
    CASE
        WHEN T.AccountCode in ('value1', 'value2') THEN
            T.Amount
    END),2)
FROM Transactions T

PartsとLaborの両方の平均を返したいのですが、AVG関数をそれらにラップしようとすると、前述のエラーが発生します。

必要な平均を正しく返すにはどうすればよいですか?

4

2 に答える 2

0

合計ではなく平均だけが必要な場合は、次のように置き換えSUMAVGください。

SELECT 
T.ReferenceNo,
Parts = ROUND(AVG(
    CASE
        WHEN T.AccountCode in ('value1', 'value2') THEN
            T.Amount
    END),2)
Labor = ROUND(AVG(
    CASE
        WHEN T.AccountCode in ('value1', 'value2') THEN
            T.Amount
    END),2)
FROM Transactions T

また、2つの値(2つの列)の平均が必要な場合は、次を使用できます。

(VALUE1 + VALUE2) / 2
于 2013-03-27T14:19:05.643 に答える
0

厳密に言えば、PartsまたはLaborNULLになる可能性があるため、単純な平均計算が混乱します。私は提案します:

select t.ReferenceNo, t.Parts, t.Labor,
       (case when Parts is null then Labor
             when Labor is null then Parts
             else (Parts + Labor) / 2
        end) as AvgPartsLabor
from (SELECT T.ReferenceNo,
             Parts = ROUND(SUM(CASE WHEN T.AccountCode in ('value1', 'value2')
                                    THEN  T.Amount
                               END),2)
             Labor = ROUND(SUM(CASE WHEN T.AccountCode in ('value1', 'value2')
                                    THEN T.Amount
                               END),2)
      FROM Transactions T
      group by t.referenceNo
     ) t

NULLパーツとレイバー値を明示的に0として扱いたい場合は、次を使用します。

select t.ReferenceNo, t.Parts, t.Labor,
       (coalesce(Parts, 0) + coalesce(Labor, 0)) / 2
. . .
于 2013-03-27T14:37:11.340 に答える