Я думаю, что это можно исправить, просто переключив COUNT для использования оконного режима.
В этом примере я закомментировал некоторые из ваших запросов, чтобы их было проще воспроизвести, но единственной частью, которую я изменил, был COUNT. строка.
Редактировать: обновлено, чтобы возвращать количество отдельных идентификаторов продукта, только в одной из строк, с остальными значениями product_count
, установленными в 0.
-- example data
with product as (select sysdate as order_date, 6698777 as account_id, -1400 as short_sales, 300 as long_sales, 100005 as product_id, 30 as price, 3 as acct_type_id from dual
union select sysdate, 6698777, -1400, 200, 100005, 30, 3 from dual
union select sysdate, 5555555, -5000, 1000, 100005, 30, 3 from dual
union select sysdate, 6998874, -4000, 325, 100005, 30, 2 from dual)
-- query
select POS.ORDER_DATE,
POS.ACCOUNT_ID,
SUM(POS.SHORT_SALES) as SHORT_SALES,
SUM(POS.LONG_SALES) as LONG_SALES,
count(distinct product_id) over () * case when row_number() over (order by product_id desc) = 1 then 1 else 0 end as product_count, -- changed this line
POS.PRICE,
POS.PRODUCT_ID,
POS.ACCT_TYPE_ID
from (
SELECT P.ORDER_DATE, P.ACCOUNT_ID, P.PRODUCT_ID, P.ACCT_TYPE_ID,P.PRICE,
--case when P.POSITION_SD < 0 THEN P.NET_POSITION_SD END AS
SHORT_SALES,
--case when P.POSITION_SD > 0 THEN P.NET_POSITION_SD END AS
LONG_SALES
FROM PRODUCT P
-- WHERE P.POSITION_DATE = '31-OCT-19'
) POS
group by POS.ORDER_DATE, POS.ACCOUNT_ID, POS.PRODUCT_ID, POS.ACCT_TYPE_ID,POS.PRICE
ORDER BY PRODUCT_ID