Если бы поле C.INDIV_CALC_DURATION_IN_S
было целым числом, я бы предположил, что это ошибка округления.Чтение еще раз, это не проблема, так как тип данных FLOAT
.
Вы все еще можете попробовать использовать это.Я не удивлюсь, если этот результат несколько отличается от предыдущего метода:
SET
C.CALC_TIME_PERCENTAGE =
(C.INDIV_CALC_DURATION_IN_S * 100.0 / V_TOTAL_CALC_TIME_IN_S)
Но вы упомянули, что в расчете на определенную дату много строк, поэтомуможет быть ошибка округления из-за этого.Попробуйте с DOUBLE
типом данных в обоих полях (или хотя бы с полем CALC_TIME_PERCENTAGE
) и посмотрите, станет ли разница от 100%
меньше.
Я не уверен, что DB2
имеет DECIMAL(x,y)
тип данных.Это может быть более уместным в этом случае.
Другая проблема заключается в том, как найти сумму CALC_TIME_PERCENTAGE
.Я полагаю, что вы (и все остальные) использовали бы:
SELECT
P_DATE, SUM(CALC_TIME_PERCENTAGE)
FROM
MY_SCHEMA.MY_CALC_DATA_TABLE C
GROUP BY P_DATE
Таким образом, у вас нет возможности определить, в каком порядке будет выполняться суммирование.Может быть даже невозможно определить это, но вы можете попробовать:
SELECT
P_DATE, SUM(CALC_TIME_PERCENTAGE)
FROM
( SELECT
P_DATE, CALC_TIME_PERCENTAGE
FROM
MY_SCHEMA.MY_CALC_DATA_TABLE C
ORDER BY P_DATE
, CALC_TIME_PERCENTAGE ASC
) AS tmp
GROUP BY P_DATE
Оптимизатор может игнорировать внутреннее пространство ORDER BY
, но оно того стоит.
Еще одна возможность дляэта большая разница состоит в том, что строки удаляются из таблицы между операциями UPDATE
и SHOW percent SUM
.
Вы можете проверить, происходит ли это, выполнив вычисления (без UPDATE) и суммируя:
SELECT
P_DATE
, SUM( INDIV_CALC_DURATION_IN_S * 100.0 / T.TOTAL )
AS PERCENT_SUM
FROM
MY_SCHEMA.MY_CALC_DATA_TABLE C
, ( SELECT SUM(INDIV_CALC_DURATION_IN_S) AS TOTAL
FROM MY_SCHEMA.MY_CALC_DATA_TABLE
) AS TMP
GROUP BY P_DATE