不确定标题是否有意义,但我会试一试。
基本上我有一个报告,我将一堆数据放入临时表,然后在网页上显示。此报告的总计需要是加权平均值,但表中的某些数据会将此平均值抛弃。
以下是临时表
中数据集的示例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
这会返回正确的总数,但正如您所看到的那样,它会变得很难看。所有这些子查询都会破坏性能。
有没有更简单的方法来获得我正在寻找的结果?我觉得必须有,但我完全是在脑力上锁定它。
感谢。
答案 0 :(得分:0)