繁体   English   中英

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

[英]Tracking Dynamic Weekly and Monthly Sales/Purchases given a fixed start date

我是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

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

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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM