2013-10-11 89 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 

这将返回正确的总数,但你可以看到它得到丑陋的快。所有这些子查询都会导致性能下降。

有没有更简单的方法来获得我要找的结果?我觉得必须有,但我完全在这个问题上大脑锁定。

谢谢。

回答