Если для каждого значения диапазона у вас есть хотя бы одно значение, то я думаю, что вы хотите:
select i.id, t.range, coalesce(t.value, 0) as value
from (select distinct id from t) i cross join
(select distinct range from t where range > 0) r left join
t
on t.id = i.id and t.range = r.range
union all
select id, range, value
from t
where range <= 0;
Как это работает? Первый подзапрос генерирует все комбинации идентификаторов и значений диапазона, где значение диапазона больше 0. Для этого используется декартово произведение различных значений id
и range
.
* LEFT JOIN
затем вводит существующие данные. И последний подзапрос вводит детрит - значения меньше 0.