0

タイトルが意味をなすかどうかはわかりませんが、これを試してみます。

基本的に、大量のデータを一時テーブルに投入して 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

これは正しい合計を返しますが、ご覧のとおり、見苦しくなります。これらのサブクエリはすべてパフォーマンスを低下させます。

私が探している結果を得る簡単な方法はありますか? あるに違いない気がしますが、これについては完全に頭がロックされています。

ありがとう。

4

1 に答える 1

0

PIVOTを使ってみませんか?

複数のピボット? 1 か月あたりの時間単位でカウントする必要がある

また、sqlfiddle にいくつかの例があります。

于 2013-10-11T17:50:17.973 に答える