Так звучит, как вам нужно работать, если максимальная рыночная стоимость для каждой группы 0 или нет, а затем процеживают соответственно, что-то вроде:
with sample_data as (select 207 id_client, 'Momentum' client, 'AAA' name, 0 market_value from dual union all
select 207 id_client, 'Momentum' client, 'AAA' name, 3514.11 market_value from dual union all
select 207 id_client, 'Momentum' client, 'BBB' name, 0 market_value from dual union all
select 207 id_client, 'Momentum' client, 'CCC' name, 84289.84 market_value from dual union all
select 207 id_client, 'Momentum' client, 'CCC' name, 358.74 market_value from dual union all
select 207 id_client, 'Momentum' client, 'DDD' name, 8289.24 market_value from dual union all
select 207 id_client, 'Momentum' client, 'DDD' name, 38.76 market_value from dual union all
select 207 id_client, 'Momentum' client, 'DDD' name, 0 market_value from dual union all
select 207 id_client, 'Momentum' client, 'EEE' name, 0 market_value from dual union all
select 207 id_client, 'Momentum' client, 'EEE' name, 0 market_value from dual),
-- end of mimicking the results of your query
res as (select id_client,
client,
name,
market_value,
max(market_value) over (partition by id_client, name) max_market_value
from sample_data)
select id_client,
client,
name,
market_value
from res
where max_market_value = 0
or (max_market_value != 0 and market_value != 0);
ID_CLIENT CLIENT NAME MARKET_VALUE
---------- -------- ---- ------------
207 Momentum AAA 3514.11
207 Momentum BBB 0
207 Momentum CCC 84289.84
207 Momentum CCC 358.74
207 Momentum DDD 8289.24
207 Momentum DDD 38.76
207 Momentum EEE 0
207 Momentum EEE 0
Это означает, что ваш запрос будет выглядеть примерно так:
select id_client,
client,
name,
market_value
from (select p.id_client,
p.client,
p.name,
h.market_value,
max(h.market_value) over (partition by p.id_client, p.name) max_market_value
from holding h
inner join portfolio p on (h.pf_id = p.pf_id)
where h.date = to_date(:p_date_string, 'DD/MM/YYYY')
and p.pf_id = :p_pf_id
and nvl (h.type, '{NULL}') not in ('Master')
and nvl (h.instrument, '{NULL}') not in ('FX'))
where max_market_value = 0
or (max_market_value != 0 and market_value != 0);
NB Как видно из приведенных выше результатов, если бы было несколько строк с рыночной стоимостью 0, вы бы увидели их все; Я предполагаю, что все в порядке?
В вашем запросе нет столбца с именем 'количество' (примечание: я не сделал нисходящего). Кроме того, 'IN' синтаксически неверны, поэтому запрос не запускается. –
Добавил ли 'AND h.MARKET_VALUE <> 0' не трюк? – dasblinkenlight
Не нужен ли только дополнительный предикат 'h.market_value! = 0'? Кроме того, почему вы делаете 'NVL (...., '')'? В Oracle нет такой вещи, как пустая строка. То, что вы делаете, эквивалентно выражению «если имеет значение NULL, а затем заменить его на null», что на самом деле не имеет смысла делать. –
Boneist