タイトルが意味をなすかどうかはわかりませんが、これを試してみます。
基本的に、大量のデータを一時テーブルに投入して Web ページに表示するレポートがあります。このレポートの合計は加重平均である必要がありますが、テーブル内の一部のデータはこの平均からずれています。
一時テーブルのデータ セットの例を次に示します。
CustomerNo CountryCode qJAN rJAN gJAN qFEB rFEB gFEB
IDS1 ID 1500 0 0 1500 0 0
ID18J ID 8000 15 120000 8000 15 120000
ID21 ID 3000 0 0 0 0 0
ID22J ID 9000 0 0 12000 0 0
ID22S ID 9500 0 0 0 0 0
ID22S ID 9500 0 0 0 0 0
ID31S ID 3000 0 0 0 0 0
ここで、qCOL は数量、rCOL はレート、gCOL はグロス (数量 * レート) です。
現在、数量とレートがある場合、値は国の合計にのみカウントされます。私が使用しているクエリは次のとおりです。
SELECT CASE SUM(qJAN) WHEN 0 THEN 0 ELSE SUM(gJAN) / SUM(qJAN) END AS JAN,
CASE SUM(qFEB) WHEN 0 THEN 0 ELSE SUM(gFEB) / SUM(qFEB) END AS FEB,
...
CASE(SUM(qJAN) + SUM(qFEB) + ... )
WHEN 0 THEN 0
ELSE
(SUM(gJAN) + SUM(gFEB) + ... ) / (SUM(qJAN) + SUM(qFEB) + ...) END AS TOT
FROM table
WHERE CountryCode = N'ID'
上記のクエリは、JAN と FEB についてそれぞれ次の加重平均を返します: 3.24 と 4.90 はどちらも間違っています。正しい結果は、どちらも 15.00 です。
問題は、上記がレートのない数量を考慮していることです。
サブクエリを使用してこれを回避できますが、私が思いついたものは制御不能になり始め、本当に行き詰まります。
SELECT CASE
(SELECT SUM(qJAN) FROM table WHERE CountryCode = N'ID' AND rJAN <> 0)
WHEN 0 THEN 0 ELSE
SUM(gJAN) /
(SELECT SUM(qJAN) FROM table WHERE CountryCode = N'ID' AND rJAN <> 0)
END AS JAN,
CASE
(SELECT SUM(qFEB) FROM table WHERE CountryCode = N'ID' AND rFEB <> 0)
WHEN 0 THEN 0 ELSE
SUM(gFEB) /
(SELECT SUM(qFEB) FROM table WHERE CountryCode = N'ID' AND rFEB <> 0)
END AS FEB,
...
CASE
(
(SELECT SUM(qJAN) FROM table WHERE CountryCode = N'ID' AND rJAN <> 0) +
(SELECT SUM(qFEB) FROM table WHERE CountryCode = N'ID' AND rFEB <> 0) +
...
)
WHEN 0 THEN 0 ELSE
(SUM(gJAN) + SUM(gFEB) + ...) /
(
(SELECT SUM(qJAN) FROM table WHERE CountryCode = N'ID' AND rJAN <> 0) +
(SELECT SUM(qFEB) FROM table WHERE CountryCode = N'ID' AND rFEB <> 0) + ...
) END AS TOT
これは正しい合計を返しますが、ご覧のとおり、見苦しくなります。これらのサブクエリはすべてパフォーマンスを低下させます。
私が探している結果を得る簡単な方法はありますか? あるに違いない気がしますが、これについては完全に頭がロックされています。
ありがとう。