Это должно помочь вам:
-- sample data
with your_query(PRODUCT_DESCRIPTION, TOTAL_AMOUNT_SOLD, WEEK_IN_MONTH) as (
select 'size 14:00: PRODUCT_ID=PQR', 7000, '1 week' from dual union all
select 'size 14:00: PRODUCT_ID=PQR', 5100, '2 week' from dual union all
select 'size 14:00: PRODUCT_ID=PQR', 7800, '3 week' from dual union all
select 'size 14:00: PRODUCT_ID=PQR', 4900, '4 week' from dual union all
select 'size 14:00: PRODUCT_ID=PQR', 6200, '5 week' from dual union all
select 'size 14:00: PRODUCT_ID=XYZ', 1000, '1 week' from dual union all
select 'size 14:00: PRODUCT_ID=XYZ', 1100, '2 week' from dual union all
select 'size 14:00: PRODUCT_ID=XYZ', 800, '3 week' from dual union all
select 'size 14:00: PRODUCT_ID=XYZ', 900, '4 week' from dual union all
select 'size 14:00: PRODUCT_ID=XYZ', 1200, '5 week' from dual )
-- end of sampe data
select t.*,
to_char(100 * TOTAL_AMOUNT_SOLD
/ sum(TOTAL_AMOUNT_SOLD) over (partition by PRODUCT_DESCRIPTION), '999.00') percent_1,
to_char(100 * TOTAL_AMOUNT_SOLD
/ sum(TOTAL_AMOUNT_SOLD) over (), '999.00') percent_2
from your_query t
Результат:
PRODUCT_DESCRIPTION TOTAL_AMOUNT_SOLD WEEK_IN_MONTH PERCENT_1 PERCENT_2
-------------------------- ----------------- ------------- --------- ---------
size 14:00: PRODUCT_ID=PQR 7000 1 week 22.58 19.44
size 14:00: PRODUCT_ID=PQR 5100 2 week 16.45 14.17
size 14:00: PRODUCT_ID=PQR 7800 3 week 25.16 21.67
size 14:00: PRODUCT_ID=PQR 4900 4 week 15.81 13.61
size 14:00: PRODUCT_ID=PQR 6200 5 week 20.00 17.22
size 14:00: PRODUCT_ID=XYZ 1000 1 week 20.00 2.78
size 14:00: PRODUCT_ID=XYZ 1100 2 week 22.00 3.06
size 14:00: PRODUCT_ID=XYZ 800 3 week 16.00 2.22
size 14:00: PRODUCT_ID=XYZ 900 4 week 18.00 2.50
size 14:00: PRODUCT_ID=XYZ 1200 5 week 24.00 3.33
Percent_1
показывает процент для каждого продукта в отдельности, Percent_2
для всех продуктов.В предложении with
, в которое я помещаю примеры данных, вы помещаете туда свой рабочий запрос.
В вашем коде есть несколько проблем, но вы не спрашиваете об этом.
Надеюсь, это поможет:)
Редактировать: Вот моя попытка полного кода.У меня нет доступа к вашим данным, я не могу их проверить, так что это может привести к опечатке, но я надеюсь, что все в порядке.Я также использовал функцию ratio_to_report
вместо деления, но это необязательно, вы можете разделить сумму на сумму.
with t as (
-- here is your current query
SELECT (REPLACE (REPLACE(p.prod_desc,'this is the famous',''), 'size XXXL','size 14.00')|| ': PRODUCT_ID=' || p.prod_id ) PRODUCT_DESCRIPTION,
SUM(s.AMOUNT_SOLD) TOTAL_AMOUNT_SOLD,
t.CALENDAR_WEEK_NUMBER
FROM sh.PRODUCTS p
JOIN sh.SALES s ON p.prod_id=s.prod_id
JOIN TIMES t ON s.time_id=t.time_id
WHERE p.prod_id IN (300,10,540)
AND TO_CHAR(t.time_id,'dd-MON-yy') LIKE '__-APR-00'
AND s.amount_sold>0
GROUP BY p.PROD_DESC,p.prod_desc, calendar_week_number, t.CALENDAR_MONTH_NUMBER,
(REPLACE (REPLACE(p.prod_desc,'this is the famous',''), 'size XXXL','size 14.00')|| ': PRODUCT_ID=' || p.prod_id ))
-- end of your query
select PRODUCT_DESCRIPTION, TOTAL_AMOUNT_SOLD,
CASE TO_CHAR(t.CALENDAR_WEEK_NUMBER) WHEN '13' THEN 'First week'
WHEN '14' THEN 'Second week'
WHEN '15' THEN 'Third week'
WHEN '16' THEN 'Fourth week'
WHEN '17' THEN 'Fifth week'
END WEEK_IN_MONTH,
to_char(100 * ratio_to_report(TOTAL_AMOUNT_SOLD)
over (partition by PRODUCT_DESCRIPTION), '999.00') percent1
from t
order by PRODUCT_DESCRIPTION, CALENDAR_WEEK_NUMBER