我想展示产品的销售情况以及该产品的销售情况,如果该产品的销售日期不是以前的销售列,则应为空。我的源表有id,name,sales_date,quantity和unit_price,结果表应该包含id,name,sales_Date,current_sale(包含当天的销售)和previous_sale。之前的销售是针对所有产品不相同的单个产品。
答案 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
我按名称使用分区,但是如果在输入表" 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
我还添加了列cnt
和prev_cnt
- 显示该产品在当前和前几天的行数。