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 OSX10.7.3上のIBMInformix11.70.FC2に対してテストしたところ、両方のクエリで除算が機能し、同じ答えが得られました(質問で必要な0.71ではなく0.81が得られることに注意してください)。
Name1 218 0.34603174603174603174603174603175
Name2 157 0.5952380952380952380952380952381
Name3 134 0.80793650793650793650793650793651
Name4 121 1.0
整数演算ではなく浮動小数点を使用して除算が行われるようにするには、CASTを使用する必要がある場合があります。ご覧のとおり、Informixでは必要ありませんでした(テーブルに数十億がある場合に備えて、SUMは浮動小数点の10進数です)。その中の行の4つだけではありません)。ROUND(xxxx, 2)
小数点以下2桁までを使用して、プレゼンテーションを改善できます。DECIMAL(6,2)へのキャストでも同じ結果が得られますが、DBMSではなく、クライアントがプレゼンテーションを担当する必要があります。