2013-10-11 119 views
0

不確定標題是否有意義,但我會給出一個答案。基於各列值的總和值

基本上我有一個報告,我把一堆數據放到臨時表中,然後顯示在網頁上。這份報告的總數需要是一個加權平均數,但表中的一些數據會拋出這個平均值。

這裏的數據存儲在臨時表

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 

這將返回正確的總數,但你可以看到它得到醜陋的快。所有這些子查詢都會導致性能下降。

有沒有更簡單的方法來獲得我要找的結果?我覺得必須有,但我完全在這個問題上大腦鎖定。

謝謝。

回答