SQL中的WITH子句

时间:2019-02-20 10:10:40

标签: sql oracle

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个字符。

1 个答案:

答案 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