查询每种产品的每日销售和以前的销售情况

时间:2015-07-29 05:44:53

标签: oracle

我想展示产品的销售情况以及该产品的销售情况,如果该产品的销售日期不是以前的销售列,则应为空。我的源表有id,name,sales_date,quantity和unit_price,结果表应该包含id,name,sales_Date,current_sale(包含当天的销售)和previous_sale。之前的销售是针对所有产品不相同的单个产品。

1 个答案:

答案 0 :(得分:0)

我们假设您在表格中有这些数据:

  ID NAME  SALES_DATE  QUANTITY     UNIT_PRICE
---- ----- ----------- -------- --------------
   1 p1    2015-07-24        10           5,00
   2 p2    2015-07-24        14          10,00
   3 p1    2015-07-28        15           4,00
   4 p2    2015-07-29         7          11,00
   5 p3    2015-07-29         3           2,00

此查询使用函数lag()生成您描述的输出(加上列previous_sales_date):

select id, name, sales_date, unit_price*quantity current_sale, 
    lag(sales_date) over (partition by name order by sales_date) prev_date, 
    lag(unit_price*quantity) over (partition by name order by sales_date) prev_sale
  from sales order by name, sales_date

SQLFiddle demo

我按名称使用分区,但是如果在输入表" id"意味着"产品ID"最好通过id使用分区。

输出:

  ID NAME  SALES_DATE  CURRENT_SALE PREV_DATE    PREV_SALE
---- ----- ----------- ------------ ----------- ----------
   1 p1    2015-07-24            50             
   3 p1    2015-07-28            60 2015-07-24          50
   2 p2    2015-07-24           140             
   4 p2    2015-07-29            77 2015-07-24         140
   5 p3    2015-07-29             6

编辑:如果每天产品条目很多,则需要某种形式的汇总,最明显的是总和, 比如下面的例子。您还可以使用min,max,avg。

select name, sales_date, sale current_sale, cnt, 
    lag(sales_date) over (partition by name order by sales_date) prev_date, 
    lag(sale) over (partition by name order by sales_date) prev_sale,
    lag(cnt) over (partition by name order by sales_date) prev_cnt 
  from (
    select name, trunc(sales_date) sales_date, sum(unit_price*quantity) sale, count(1) cnt
      from sales group by name, trunc(sales_date)
    )
  order by name, sales_date

SQLFiddle demo

我还添加了列cntprev_cnt - 显示该产品在当前和前几天的行数。