在给定固定开始日期的情况下跟踪动态的每周和每月销售/购买情况

时间:2018-07-25 12:17:01

标签: sql oracle

我是Oracle SQL编程的新手(实际上通常是编程),最近才发现分析功能。我相信我可以使用它们来自动化我的每日,每周和每月报告。

我需要帮助来跟踪每周和每月的销售和购买,并将特定日期定为年初和/或周初。

我有一张表格,可以维护销售代理商的日常销售和采购交易,如何动态跟踪每周(每周开始)以及每个地区每个地区每月按月购买的收入增长(自今年开始)从我们的交易表中。

我们的报告周从星期三至星期二。我已经设法获得了一些逐月的输出(尽管不是完全准确),但是逐周挑战了我。如何在Oracle SQL中维护一个动态的天数计数器,该计数器在整个每日交易表中加起来最多为7天时会刷新并从下一个星期开始?

我脑子里似乎无法输入代码的有趣挑战是,当我拥有一周的部分数据时会发生什么?我希望能够比较,例如,本周的3天交易额与前一周的3天交易额。对于一个月的部分数据来说,也可以这样说。

这是我到目前为止管理的按月分析代码。

WITH

monthly_revenue as (

SELECT
to_char(txn_date, 'YYYY-MM') as month_key,
sum(stock_purchased) as revenue
FROM transactions_table
GROUP BY  to_char(date_key, 'YYYY-MM')
),

prev_month_revenue as (

SELECT 
month_key, revenue, lag(revenue) over (order by month_key) as 
prev_month_revenue
FROM monthly_revenue
)

SELECT month_key,revenue,prev_month_revenue, round(100.0*(revenue- 
prev_month_revenue)/prev_month_revenue,1) as revenue_growth
FROM prev_month_revenue

ORDER BY month_key;

我的桌子的结构如下:

txn_date DATE, agent_id NUMBER(12), supervisor_id NUMBER(12), stock_purchased NUMBER(15), stock_sold NUMBER(15), no_of_txns NUMBER(15), account_balance NUMBER(15)

我希望以以下格式显示输出;

Week-Start | Week-End | Week_Purchases | Previous_Week_Purchases | % Growth

如果我可以克服跟踪每周购买和销售的最初障碍,那么我可以轻松附加位置信息。

1 个答案:

答案 0 :(得分:1)

trunc函数将日期截断为指定的单位。默认情况下,这是一天。但是,您也可以使用它来获取前一周/月/季度/年的开始。

iw格式返回ISO周的开始。这是星期一。

那么在运行Weds-Tues数周的过程中,这对您有什么帮助?

从日期中减去两个,然后将其传递给trunc和voila!

with rws as (
  select date'2018-07-24'+level dt from dual
  connect by level <= 14
)
  select * from rws;

DT            
25-JUL-2018   
26-JUL-2018   
27-JUL-2018   
28-JUL-2018   
29-JUL-2018   
30-JUL-2018   
31-JUL-2018   
01-AUG-2018   
02-AUG-2018   
03-AUG-2018   
04-AUG-2018   
05-AUG-2018   
06-AUG-2018   
07-AUG-2018 

with rws as (
  select date'2018-07-24'+level dt from dual
  connect by level <= 14
)
  select trunc ( dt-2, 'iw' ),
         to_char ( min ( dt ), 'DY' ) week_start_day,
         to_char ( max ( dt ), 'DY' ) week_end_day
  from   rws
  group  by trunc ( dt-2, 'iw' )
  order  by trunc ( dt-2, 'iw' );

TRUNC(DT-2,'IW')   WEEK_START_DAY   WEEK_END_DAY   
23-JUL-2018        WED              TUE            
30-JUL-2018        WED              TUE     

关于:

我希望能够比较当前一周的3天价值和上一周的3天价值

我不确定您在这里问什么。但是,您可以使用分析函数的windowing子句来获取与当前值有特定偏移量的值。例如,以下计算两个运行总计。过去三天中的第一天。第二个是前一周对应的三天:

with rws as (
  select date'2018-07-24'+level dt , 
         round ( dbms_random.value( 1, 100 ) ) val
  from   dual
  connect by level <= 10
)
  select dt, val, 
         sum ( val ) over ( 
           order by dt range between 3 preceding and current row 
         ) past_three, 
         sum ( val ) over ( 
           order by dt range between 10 preceding and 7 preceding 
         ) three_prev_week
  from   rws
  order  by dt;

DT            VAL   PAST_THREE   THREE_PREV_WEEK   
25-JUL-2018       5            5            <null> 
26-JUL-2018      89           94            <null> 
27-JUL-2018      34          128            <null> 
28-JUL-2018      88          216            <null> 
29-JUL-2018      48          259            <null> 
30-JUL-2018      25          195            <null> 
31-JUL-2018      19          180            <null> 
01-AUG-2018      71          163                 5 
02-AUG-2018      12          127                94 
03-AUG-2018      39          141               128