平均销售季度与上一季度平均销售

时间:2015-09-01 13:37:47

标签: oracle common-table-expression window-functions

我有一个表格,其中有各种属性,如地区产品,年份,季节,月份,销售。我必须计算具有相同区域的每个产品的avg_qtr销售并显示他们之前的avg_qtr销售。我已经阅读了关于滞后但是这里不可能使用,因为它将在重复多少行之后不固定。我的表结构是这样的

   Region Product Year Qtr Month Sales 

    NORTH   P1    2015  1   JAN 1000
    NORTH   P1    2015  1   FEB 2000
    NORTH   P1    2015  1   MAR 3000
    NORTH   P1    2015  2   APR 4000
    NORTH   P1    2015  2   MAY 5000
    NORTH   P1    2015  2   JUN 6000
    NORTH   P1    2015  3   JUL 7000
    NORTH   P1    2015  3   AUG 8000
    NORTH   P1    2015  3   SEP 9000
    NORTH   P1    2015  4   OCT 1000
    NORTH   P1    2015  4   DEC 4000
    NORTH   P1    2015  4   NOV 2000
    NORTH   P3    2015  1   FEB 1000
    NORTH   P3    2015  1   FEB 9000
    NORTH   P3    2015  2   APR 2000
    NORTH   P3    2015  3   JUL 8000
    NORTH   P1    2016  1   MAR 3000
    NORTH   P1    2016  1   FEB 1000
    NORTH   P1    2016  1   JAN 2000
    SOUTH   P1    2015  1   JAN 2000
    SOUTH   P1    2015  1   FEB 3000
    SOUTH   P1    2015  1   JAN 4000
    SOUTH   P2    2015  1   MAR 1000
    SOUTH   P2    2015  1   JAN 8000
    SOUTH   P2    2015  1   FEB 9000
    SOUTH   P2    2015  2   JUN 9000
    SOUTH   P2    2015  2   MAY 8000
    SOUTH   P2    2015  2   APR 2000
    SOUTH   P2    2015  3   SEP 4000
    SOUTH   P2    2015  3   AUG 2000
    SOUTH   P2    2015  3   JUL 1000
    SOUTH   P2    2015  4   NOV 2000
    SOUTH   P2    2015  4   DEC 1000
    SOUTH   P2    2015  4   OCT 5000
    SOUTH   P3    2015  3   AUG 9000
    SOUTH   P3    2015  4   OCT 1000
    SOUTH   P3    2015  4   NOV 3000
    SOUTH   P2    2016  1   JAN 2000
    SOUTH   P2    2016  1   JAN 4000

我写了一个计算当前qtr的查询,并显示前一个avg,当前为一个

  WITH AvgSales
AS (SELECT
region,
product,
year,
qtr,
ROUND(AVG(sales), 2) AS avg_Sale
FROM one 
GROUP BY region,
product,
year,qtr
 )
SELECT
s.region,
s.product,
s.year,
s.month,
s.sales,
avg.qtr,
avg.avg_Sale AS Qtr_Avg_Sale,
prev.avg_sale AS Prev_Qtr_Avg_Sale
FROM one s
JOIN AvgSales avg
ON s.region = avg.region
AND s.product = avg.product
AND s.QTR = avg.qtr
AND s.year = avg.year
LEFT JOIN AvgSales prev
ON  (s.region = prev.region
AND s.product = prev.product
AND s.year - 1 = prev.year
and s.qtr=1
AND prev.qtr = 4) or
(s.region = prev.region
AND s.product = prev.product
AND s.year = prev.year
AND s.qtr - 1 = prev.qtr) ;

我能够获得该产品的当前平均值和之前的平均值,但反之亦然。我不知道如何显示该季度以前没有任何销售的季度。 我想要这样的输出 -

Region  Product  Year  qtr  month   sale  avg_Sale     prev_avg_sale
    NORTH     P1     2015   1   JAN     1000    2000    
    NORTH     P1     2015   1   FEB     2000    2000    
    NORTH     P1     2015   1   MAR     3000    2000    
    NORTH     P1     2015   2   APR     4000    5000            2000
    NORTH     P1     2015   2   MAY     5000    5000            2000
    NORTH     P1     2015   2   JUN     6000    5000            2000
    NORTH     P1     2015   3   JUL     7000    8000            5000
    NORTH     P1     2015   3   AUG     8000    8000            5000
    NORTH     P1     2015   3   SEP     9000    8000            5000
    NORTH     P1     2015   4   OCT     1000    2333.33         8000
    NORTH     P1     2015   4   NOV     2000    2333.33         8000
    NORTH     P1     2015   4   DEC     4000    2333.33         8000
    SOUTH     P2     2015   1   JAN     8000    6000    
    SOUTH     P2     2015   1   FEB     9000    6000    
    SOUTH     P2     2015   1   MAR     1000    6000    
    SOUTH     P2     2015   2   APR     2000    6333.33         6000
    SOUTH     P2     2015   2   MAY     8000    6333.33         6000
    SOUTH     P2     2015   2   JUN     9000    6333.33         6000
    SOUTH     P2     2015   3   JUL     1000    2333.33       6333.33
    SOUTH     P2     2015   3   AUG     2000    2333.33       6333.33
    SOUTH     P2     2015   3   SEP     4000    2333.33       6333.33
    SOUTH     P2     2015   4   OCT     5000    2666.67       2333.33
    SOUTH     P2     2015   4   NOV     2000    2666.67       2333.33
    SOUTH     P2     2015   4   DEC     1000    2666.67       2333.33
    NORTH     P3     2015   1   FEB     9000    5000    
    NORTH     P3     2015   1   FEB     1000    5000    
    NORTH     P3     2015   2   APR     2000    2000           5000
    NORTH     P3     2015   3   JUL     8000    8000           2000
    SOUTH     P3     2015   3   AUG     9000    9000    
    SOUTH     P3     2015   4   OCT     1000    2000           9000
    SOUTH     P3     2015   4   NOV     3000    2000           9000
    NORTH     P1     2016   1   JAN     2000    2000         2333.33
    NORTH     P1     2016   1   FEB     1000    2000         2333.33
    NORTH     P1     2016   1   MAR     3000    2000         2333.33
    NORTH     P2     2016   2                   2000
    SOUTH     P2     2016   1   JAN     2000    3000         2666.67
    SOUTH     P2     2016   1   JAN     4000    3000         2666.67
    SOUTH     P2     2016   2                   3000  
    SOUTH     P1     2015   1   JAN     4000    3000    
    SOUTH     P1     2015   1   JAN     2000    3000    
    SOUTH     P1     2015   1   FEB     3000    3000        

0 个答案:

没有答案