Sum по disitnct полю , в другой колонке
Чалышев Максим Михайлович
Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA
-- итак требуется найти сумму по distinct полю на основе идентификатора, который находится в другой колонке
-- е1сть доп условие нельзя использовать подзапрос, то есть необходимо выполнить задачу за одно обращение
-- подготовим данные для тестового примера
-- есть вторичный ключ fid от которого зависит значение в поле price
-- необходимо найти сумму по полю price в distinct поля fid одним запросом, то есть без вложенного select
-- надо как то так
-- первое решение,
-- работает быстро, но решение не идеально, ключ может быть и не числовой
-- сумма Id + price - сумма id
-- , во избежание неприятностей использовали to_number(rpad(fid, 20)
-- решение второе - используем model
Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA
-- итак требуется найти сумму по distinct полю на основе идентификатора, который находится в другой колонке
-- е1сть доп условие нельзя использовать подзапрос, то есть необходимо выполнить задачу за одно обращение
-- подготовим данные для тестового примера
drop table t; -- если надо create table t as WITH r AS ( select /*+ materialize */ * from ALL_OBJECTS WHERE ROWNUM < 100 ) select object_id as id,length(r.object_name) as fid, (select count(1) from r a where length(r.object_name) = length(a.object_name)) as price from r
-- есть вторичный ключ fid от которого зависит значение в поле price
-- необходимо найти сумму по полю price в distinct поля fid одним запросом, то есть без вложенного select
select sum(price) sm from t-- это неправильное решение
select sum(distinct price) sm from t-- и это неправильное решение price может быть одинаковый для разных fid
-- надо как то так
select sum(price distinct fid) sm from t-- но так написать нельзя
-- первое решение,
-- работает быстро, но решение не идеально, ключ может быть и не числовой
-- сумма Id + price - сумма id
-- , во избежание неприятностей использовали to_number(rpad(fid, 20)
select sum(distinct to_number(rpad(fid,10,'0')) +price) - sum(distinct to_number(rpad(fid,10,'0'))) as sm from t
-- решение второе - используем model
select r from t model return updated rows dimension by(id) measures(0 r, nullif(price, lag(price)over(partition by fid order by id)) lg) rules upsert(r[0] = sum(lg)[any])