Если поле VAL имеет тип Float64, то и выражение sum/sum_all имеет тип Float64.
Точность связана с особенностью
хранения типов с плавающей точкой. При этом сложно предсказать, какая точность получится у результата. Она зависит от распределения VAL, количества суммируемых чисел, а также порядка суммирования (который в таком запросе может быть произвольным). В частности, при повторных запусках могут получаться разные результаты.
Если точность важна, можно хранить значения в Int64, домноженные на константу.
Кажется, что запрос можно сделать без JOIN секции. Примерно так:
select ID
from
(
select ID, (select sum(VAL) from DB.MY_TABLE) sum_all, sum(VAL)/sum_all as fraction