Правильный запрос для отображения нужных вам данных должен быть
select st_id, st_date, st_sl, income_amount, util_date, util_amount
from income i
left join util u on
i.st_id = u.st_id
and i.st_date = u.st_date
and i.st_sl = u.st_sl;
Обратите внимание на левые в условии соединения.
Но вы хотите, чтобы эти "дублирующие" строки дохода были подавленыв один ряд.Это можно сделать несколькими способами, но одна из них будет выглядеть следующим образом:
select case when util.serial_no = 1 then i.st_id end as st_id,
case when util.serial_no = 1 then i.st_date end as st_date,
case when util.serial_no = 1 then i.st_sl end as st_sl,
income_amount,
util_date,
util_amount
from income i
left join util u on
i.st_id = u.st_id
and i.st_date = u.st_date
and i.st_sl = u.st_sl;
ОБНОВЛЕНИЕ1:
По мере изменения образца данных и объяснения, другой запрос для соответствиязапрос будет:
select
case when row_number() over (partition by i.st_id, i.st_sl, u.util_date order by u.serial_no) = 1
then i.st_id
end as st_id,
case when row_number() over (partition by i.st_id, i.st_sl, u.util_date order by u.serial_no) = 1
then i.st_date
end as st_date,
case when row_number() over (partition by i.st_id, i.st_sl, u.util_date order by u.serial_no) = 1
then i.st_sl
end as st_sl,
i.income_amount,
u.util_date,
u.serial_no,
u.util_amount
from income i
left join util u on
i.st_id = u.st_id
and i.st_date = u.st_date
and i.st_sl = u.st_sl;
Итак, первые три столбца получают значения только для первых строк в группе std_id, st_sl, util_date.
См. скрипку для демонстрации.(также было бы неплохо, если бы вы в следующий раз задали вопрос тестовым данным.)