与以前的销售当日销售

时间:2015-09-18 06:35:17

标签: oracle oracle11g group-by

我的问题是编写一个查询来显示带有Sale_date的产品名称,当天销售的产品数量,前一天销售的产品数量(可能是非连续的)。 我的输入表是这样的 - 产品

id    Name     Brand

10    Nexus     LG

20     Z2      Sony

30    Alpha   Samsung

40     6S      Apple

和 我的销售表就像这样 -

Invoice_No,Product_Id     Sale_Date           Quantity

122300       10     23-11-14 09:00:00 AM      5

122300       20     23-11-14 05:00:00 PM      2

122311       10     24-11-14 10:00:00 AM      1

122312       20     24-11-14 10:05:00 AM      2

122313       10     24-11-14 10:10:00 AM     10

122314       30     24-11-14 12:00:00 PM     10

122315       10     24-11-14 04:00:00 PM      3

122316       40     25-11-14 11:33:00 PM      2

122317       10     29-11-14 03:10:15 PM      5

122318       20     30-11-14 05:06:10 PM     10

122319       10     30-11-14 11:15:06 AM      15

122320       10     01-12-14 12:00:00 PM      10

我的输出表是这样的 -

PRODUCT_ID,SALE_DATE,CurrentDay_Count,PrevDay_count

10      23-11-14    5   
10      24-11-14    14               15
20      23-11-14    2   
20      24-11-14    2                2
30      24-11-14    10  
30      25-11-14    3                10
40      25-11-14    2   
10      29-11-14    5                14
20      30-11-14    10               2
10      30-11-14    15               5
10      01-12-14    10               15

我知道我可以用延迟来做,但有没有使用滞后的方法。如果有人能建议的话。谢谢!!!

1 个答案:

答案 0 :(得分:1)

没有最近计数的查询很简单:

select 
  product_id,
  trunc(sale_date) as sale_date,
  sum(quantity) as currentday_count
from sales
group by trunc(sale_date), product_id
order by trunc(sale_date), product_id;

使用LAG

可以简单快速地获得之前的值
select 
  product_id,
  sale_date,
  currentday_count,
  lag(currentday_count) over (partition by product_id order by sale_date) as prevday_count
from
(
  select 
    product_id,
    trunc(sale_date) as sale_date,
    sum(quantity) as currentday_count
  from sales
  group by trunc(sale_date), product_id
)
order by sale_date, product_id;

但是有人要求你不要使用LAG,而是写一个更慢,更复杂的查询。您必须多次访问相同的中间结果(每日销售),因此您将使用WITH子句并在相关子查询中获取先前的销售额:

with daily_sales as
(
  select 
    product_id,
    trunc(sale_date) as sale_date,
    sum(quantity) as currentday_count
  from sales
  group by trunc(sale_date), product_id
)
select 
  product_id,
  sale_date,
  currentday_count,
  (
    select max(currentday_count) keep (dense_rank last order by sale_date)
    from daily_sales older
    where older.product_id = daily_sales.product_id
    and older.sale_date < daily_sales.sale_date
  ) as prevday_count
from daily_sales
order by sale_date, product_id;

这仍然使用分析函数(KEEP LAST)。没有它,查询将变得更加复杂并且可能会变慢。