sql - 在固定开始日期的情况下跟踪动态的每周和每月销售/采购
问题描述
我是 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 周的开始。这是星期一。
那么,这对您在周三至周二运行数周有何帮助?
在将其传递给 trunc 之前,从您的日期中减去两个,瞧!
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 天进行比较
我不确定你在这里问什么。但是您可以使用分析函数的窗口子句来获取与当前值处于特定偏移量的值。例如,以下计算两个运行总计。过去三天的第一次。第二个对应前一周的三天:
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
推荐阅读
- reactjs - 在 JSX 中嵌套 If 语句
- reactjs - 使用 cypress 测试 Echarts 反应组件
- javascript - 如何对表格的行进行分组(按“数量”单元格)?
- html - 如何将导航与标题对齐
- asp.net-core - 重新设计 Abp.IdentityServer 的 UI(身份服务器 4)
- javascript - 在错误 500 上处理 puppeteer click 和 waitForNavigation 承诺
- sed - 删除方括号之间包含特定文本的所有行
- javascript - 如果在 2 个浏览器选项卡上,Angularjs 通知显示两次
- c++ - 模板类中的未知标识符
- android-studio - 哪些文件要备份 android studio (jks Keys)