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
这将返回正确的总数,但你可以看到它得到丑陋的快。所有这些子查询都会导致性能下降。
有没有更简单的方法来获得我要找的结果?我觉得必须有,但我完全在这个问题上大脑锁定。
谢谢。