如果你不使用 OLAP 函数,那么你必须在表上做一个奇怪的自连接:
SELECT a.ColA, a.ColB, SUM(b.ColB) AS ColX
FROM #MyTempTable AS a
JOIN #MyTempTable AS b
ON a.ColA <= b.ColA
GROUP BY a.ColA, a.ColB
这为您提供了原始累积 SUM。您绝对可以将其用作子查询来获得答案,注意要获得百分比,您需要将累积总和除以总和:
SELECT ColA, ColB, ColX / (SELECT SUM(ColB) FROM MyTempTable) AS ColC
FROM (SELECT a.ColA, a.ColB, SUM(b.ColB) AS ColX
FROM #MyTempTable AS a
JOIN #MyTempTable AS b
ON a.ColA <= b.ColA
GROUP BY a.ColA, a.ColB
) AS X
ORDER BY ColA
你可以只写:
SELECT a.ColA, a.ColB, SUM(b.ColB) / (SELECT SUM(ColB) FROM MyTempTable) AS ColC
FROM #MyTempTable AS a
JOIN #MyTempTable AS b
ON a.ColA <= b.ColA
GROUP BY a.ColA, a.ColB
ORDER BY a.ColA
将 ColC 表达式乘以 100 以获得百分比而不是分数。
在 Mac OS X 10.7.3 上针对 IBM Informix 11.70.FC2 进行了测试,这两个查询都具有除法工作,产生了相同的答案(我注意到我得到了 0.81 而不是问题中要求的 0.71):
Name1 218 0.34603174603174603174603174603175
Name2 157 0.5952380952380952380952380952381
Name3 134 0.80793650793650793650793650793651
Name4 121 1.0
您可能必须使用 CAST 来确保使用浮点而不是整数算术来完成除法 - 正如您所看到的,这对于 Informix 不是必需的(无论如何,SUM 都是浮点小数,以防万一表有数十亿其中的行数,而不仅仅是其中的 4 个)。我可以改进演示文稿ROUND(xxxx, 2)
,只保留 2 个小数位;转换为 DECIMAL(6,2) 将获得相同的结果,但客户端应负责演示,而不是 DBMS。