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
這將返回正確的總數,但你可以看到它得到醜陋的快。所有這些子查詢都會導致性能下降。
有沒有更簡單的方法來獲得我要找的結果?我覺得必須有,但我完全在這個問題上大腦鎖定。
謝謝。