with WEEKLY_PERCENT_SOLD AS (
SELECT ROUND(count(AMOUNT_SOLD) * 100/ SUM(amount_sold), 2) TOTAL
FROM SALES)
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",
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"
FROM sh.PRODUCTS p INNER JOIN sh.SALES s
ON p.prod_id=s.prod_id
INNER 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 ),
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
ORDER BY PRODUCT_DESCRIPTION, t.CALENDAR_WEEK_NUMBER;
添加另一列以计算当月给定星期内的销售额相对于当月总销售额的百分比。为Weekly_percent_sold列指定一个名称。设置百分比值的格式,以便它们在逗号后精确输出2个字符。
答案 0 :(得分:2)
这应该对您有帮助
-- 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