Если вы не используете функции 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
Это дает вам необработанную кумулятивную СУММУ. Вы определенно можете использовать это как подзапрос для получения ответа, отметив, что для получения процента вам нужно разделить совокупную сумму на общую сумму:
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, чтобы получить процент вместо дроби.
Протестировано на IBM Informix 11.70.FC2 в Mac OS X 10.7.3, оба запроса с делением работают, давая один и тот же ответ (и я отмечаю, что я получаю 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) даст тот же результат, но ответственность за представление должен нести клиент, а не СУБД.
person
Jonathan Leffler
schedule
28.08.2012
#MyTempTable
MS SQL Server? Мы не должны гадать, однако. - person Jonathan Leffler   schedule 28.08.2012