我是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
如果我可以克服跟踪每周购买和销售的最初障碍,那么我可以轻松附加位置信息。
答案 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