一、需求
1. 需求背景
- 需求一:統計當前及歷史同期業務量並在一個字段內展示;
- 需求二:統計指定時間段內業務總量;
2. 最終效果展示
2.1 模擬表的表結構
本文以水果銷量模擬真實的業務量
2.2 當前及歷史同期效果展示
統計近7天內和歷史同期各水果銷量
2.3 某時間段內總計效果展示
統計2019年全年各水果銷量總計
二.腳本
1. 當前及歷史同期腳本
#!/usr/bin/ksh
#運行示例:sh fru_calc_day.sh
#本腳本用於統計每日及同期歷史的水果銷量
#統計時間從前D1天開始,默認爲7,即統計從7天前開始
D1=7
#統計時間到前D2天,默認爲1,即截止到前一天
D2=1
#歷史數據,默認爲12,即前12個月(去年)
M=12
#日誌時間格式
filedate=`date +"%Y%m%d%H%M"`
#日誌名
REPORT="/tmp/fru/report$filedate.log"
#數據庫用戶名/密碼,根據實際情況填寫
DBUSER=dbuser
DBPASSWD=password
#數據庫環境變量,根據實際情況填寫
export ORACLE_SID=mydb
export ORACLE_BASE=/oracle/app/10.2.0
export ORACLE_HOME=$ORACLE_BASE/db_1
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
export NLS_LANG="SIMPLIFIED Chinese_CHINA.ZHS16GBK"
FRU_CALC() {
echo "***************************每日水果銷量統計***************************">> $REPORT
sqlplus -s /nolog << EOS | sed '1d' | sed '/rows selected/d'
conn $DBUSER/$DBPASSWD
set linesize 999
set pages 999
col 日期 format a30
col 蘋果(歷史同期) format a30
col 梨子(歷史同期) format a30
col 香蕉(歷史同期) format a30
col 橙子(歷史同期) format a30
select f.day as "日期",
f.app as "蘋果(歷史同期)",
f.pea as "梨子(歷史同期)",
f.ban as "香蕉(歷史同期)",
f.ora as "橙子(歷史同期)"
from (select t.day,
t.app || '(' || y.app || ')' as app,
t.pea || '(' || y.pea || ')' as pea,
t.ban || '(' || y.ban || ')' as ban,
t.ora || '(' || y.ora || ')' as ora
from (select a.day,
a.apple as app,
a.pear as pea,
a.banana as ban,
a.orange as ora
from fruits a
where a.day between TRUNC(sysdate - $D1, 'DD') and
TRUNC(sysdate - $D2, 'DD')) t,
(select a.day,
a.apple as app,
a.pear as pea,
a.banana as ban,
a.orange as ora
from fruits a
where a.day between
TRUNC(ADD_MONTHS(sysdate, -$M) - $D1, 'DD') and
TRUNC(ADD_MONTHS(sysdate, -$M) - $D2, 'DD')) y
where ADD_MONTHS(t.day, -$M) = y.day) f
order by f.day;
quit
EOS
}
FRU_CALC >>$REPORT 2>&1
echo "*****************************end*****************************">> $REPORT
本文腳本的執行shell爲/usr/bin/ksh,可根據實際情況修改,運行命令echo $SHELL可查看當前用戶的shell類型。
2. 某時間段內總計腳本
#!/usr/bin/ksh
#運行示例:sh fru_calc_sum.sh 20190101 20191231
#本腳本用於統計月度、年度或任意時間段內水果銷量彙總
#參數1,開始時間
startdate="$1"
#參數2,結束時間
enddate="$2"
#日誌時間格式
filedate=`date +"%Y%m%d%H%M"`
#日誌名
REPORT="/tmp/fru/report$filedate.log"
#數據庫用戶名/密碼,根據實際情況填寫
DBUSER=dbuser
DBPASSWD=password
#數據庫環境變量,根據實際情況填寫
export ORACLE_SID=mydb
export ORACLE_BASE=/oracle/app/10.2.0
export ORACLE_HOME=$ORACLE_BASE/db_1
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
export NLS_LANG="SIMPLIFIED Chinese_CHINA.ZHS16GBK"
FRU_CALC() {
echo "***********歷史水果銷量總計:'$startdate'至'$enddate'***********">> $REPORT
sqlplus -s /nolog << EOS | sed '1d' | sed '/rows selected/d'
conn $DBUSER/$DBPASSWD
set linesize 999
set pages 999
select sum(f.app) as "蘋果",
sum(f.pea) as "梨子",
sum(f.ban) as "香蕉",
sum(f.ora) as "橙子"
from (select a.day,
sum(a.apple) as app,
sum(a.pear) as pea,
sum(a.banana) as ban,
sum(a.orange) as ora
from fruits a
where a.day between to_date('$startdate', 'yyyymmdd') and
to_date('$enddate', 'yyyymmdd')
group by a.day) f;
quit
EOS
}
FRU_CALC >>$REPORT 2>&1
echo "*****************************end*****************************">> $REPORT
統計20190101至 20191231水果銷量彙總。
三、運行效果
1. 當前及歷史同期查詢
2. 某時間段內總計查詢
本文所有腳本已上傳github:scripts-for-select-now-history-and-sum-from-db