根据各个列值求和值

时间:2013-10-11 17:47:14

标签: sql-server tsql sum

不确定标题是否有意义,但我会试一试。

基本上我有一个报告,我将一堆数据放入临时表,然后在网页上显示。此报告的总计需要是加权平均值,但表中的某些数据会将此平均值抛弃。

以下是临时表

中数据集的示例
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

这会返回正确的总数,但正如您所看到的那样,它会变得很难看。所有这些子查询都会破坏性能。

有没有更简单的方法来获得我正在寻找的结果?我觉得必须有,但我完全是在脑力上锁定它。

感谢。

1 个答案:

答案 0 :(得分:0)

你为什么不使用PIVOT?

Multiple PIVOTS? Need to count by Hour Per Month

在sqlfiddle上有几个例子..