|
||
---|---|---|
.idea | ||
doc | ||
dw | ||
finereport | ||
leading-project.iml | ||
README.md | ||
映射表规范.md | ||
看板上线后修改记录-杨坤安.md |
领悦看板项目代码库
一、代码范围说明
1.数仓dw
- dim层表加工逻辑: dw/dim
- dwd层表加工逻辑: dw/dwd
- dws层表加工逻辑: dw/dws
2.帆软报表后台逻辑finereport
- 明细表加工逻辑
- 大屏关键指标加工逻辑
- 填报表目标库表及校验规则
二、SQL开发规范分享
1. 建表脚本(DDL)
【建表语句】
命名规则示例: create_dwd_cost_budget_data_d.sql
-- *****************************************
-- 开发人员: 杨坤安
-- 创建日期: 2024-07-18
-- 功 能: 费控预算金额明细表
-- *****************************************
DROP TABLE IF EXISTS dw.dwd_cost_budget_data_d;
CREATE TABLE IF NOT EXISTS dw.dwd_cost_budget_data_d (
dimaccountcode VARCHAR(255) COMMENT '预算科目编码'
,dimaccountname VARCHAR(255) COMMENT '预算科目名称'
,dimsubjectcode VARCHAR(255) COMMENT '组织机构编码'
,dimsubjectname VARCHAR(255) COMMENT '组织机构名称'
,yearname VARCHAR(50) COMMENT '年'
,totalcode VARCHAR(255) COMMENT '组织机构层级编码'
,monthname VARCHAR(50) COMMENT '月'
,buget VARCHAR(255) COMMENT '预算金额'
,occ VARCHAR(255) COMMENT '已占用金额'
,realfee VARCHAR(255) COMMENT '已使用金额'
,available VARCHAR(255) COMMENT '剩余可用金额'
,budgetfee_rate VARCHAR(50) COMMENT '预算执行率'
)COMMENT = '费控预算金额明细表'
【修改表字段】
命名规则示例: alter_dwd_cost_budget_data_d.sql
-- *****************************************
-- 开发人员: 杨坤安
-- 修改日期: 2024-07-18
-- 修改内容: 字段修改 monthname -> month_name
-- ... -> ...
-- *****************************************
ALTER TABLE dw.dwd_cost_budget_data_d MODIFY COLUMN monthname month_name;
【字段命名规范】
-
字段中文名翻译过来的单词来命名
-
如果翻译的单词太长,可以适当截取单词,尽量直观一点
-
不要使用拼音、关键字命名字段
【表命名规范】
数仓层_业务域_主要业务数据_跑数天(D|M|Q|Y|)
如: dwd_cost_budget_data_d
2. 数据转换、加载(DML)
【关键字大写】
使用select、from、where等关键字时使用大写
【层级关联表别名】
多个表关联,最外层用T1、T2、T3等顺序命名
里面关联子表使用A、B、C、D顺序命名
子表中关联使用A1、A2、B1、B2顺序命名
【注释】
脚本头注释: 写明谁开发的、开发日期、改段sql主要的功能是什么
字段注释: 每个字段必写字段的中文名称,方便理解
复杂功能注释: 如果有较复杂的加工逻辑,简要注释写一下该段的加工说明
【其他】
字段分割符,
放到第一列,批量修改比较容易
注释间隔、缩进怎么整齐怎么来
【示例】
truncate dw.dwd_cost_detail_data_d;
INSERT into dw.dwd_cost_detail_data_d
SELECT
T1.yearname AS yearname -- 年
,T1.monthname AS monthname -- 月
,T2.organ_code AS organ_code -- 片区ID
,T2.organ_name AS organ_name -- 片区名称
,T1.cost_code AS cost_code -- 成本类型编码: LC:行政成本 AC:人力成本
,T1.cost_name AS cost_name -- 成本类型名称
,T1.dimsubjectcode AS dimsubjectcode -- 组织机构编码
,T1.dimsubjectname AS dimsubjectname -- 组织机构名称
,T1.totalcode AS totalcode -- 组织机构层级编码
,T1.dimaccountcode AS dimaccountcode -- 预算科目编码
,T1.dimaccountname AS dimaccountname -- 预算科目名称
,T1.buget AS buget -- 预算金额
,T1.occ AS occ -- 已占用金额
,T1.realfee AS realfee -- 已使用金额
,T1.available AS available -- 剩余可用金额
,T1.budgetfee_rate AS budgetfee_rate -- 预算执行率
,T1.originalcurrency AS originalcurrency -- 调整金额
,T1.target_fee AS target_fee -- 目标值
,T1.actual_fee AS actual_fee -- 实际值
,ROUND((T1.target_fee - T1.actual_fee),2) AS diff_amount -- 差额
,case when T1.target_fee = 0 then '0%' else concat(ROUND((T1.actual_fee / T1.target_fee)*100,2),'%') end AS implementation_rate -- 执行率
FROM
(
SELECT
A.yearname AS yearname -- 年
,A.monthname AS monthname -- 月
,'LC' AS cost_code -- 成本类型编码: LC:行政成本 AC:人力成本
,'行政成本' AS cost_name -- 成本类型名称
,A.dimsubjectcode AS dimsubjectcode -- 组织机构编码
,A.dimsubjectname AS dimsubjectname -- 组织机构名称
,A.totalcode AS totalcode -- 组织机构层级编码
,A.dimaccountcode AS dimaccountcode -- 预算科目编码
,A.dimaccountname AS dimaccountname -- 预算科目名称
,A.buget AS buget -- 预算金额
,A.occ AS occ -- 已占用金额
,A.realfee AS realfee -- 已使用金额
,A.available AS available -- 剩余可用金额
,A.budgetfee_rate AS budgetfee_rate -- 预算执行率
,COALESCE(B.originalcurrency,0) AS originalcurrency -- 调整金额
,ROUND((A.buget - COALESCE(B.originalcurrency,0)),2) AS target_fee -- 目标值
,A.realfee AS actual_fee -- 实际值
-- ,'' AS diff_amount -- 差额
-- ,'' AS implementation_rate -- 执行率
FROM
(
SELECT
dimaccountcode -- 预算科目编码
,dimaccountname -- 预算科目名称
,dimsubjectcode -- 组织机构编码
,dimsubjectname -- 组织机构名称
,yearname -- 年
,totalcode -- 组织机构层级编码
,monthname -- 月
,buget -- 预算金额
,occ -- 已占用金额
,realfee -- 已使用金额
,available -- 剩余可用金额
,budgetfee_rate -- 预算执行率
FROM dw.dwd_cost_budget_data_d -- 预算金额明细表
WHERE dimaccountcode IN('WY0402','WY040201','WY040202','WY040203','WY040204','WY040205','WY040206','WY040207','WY040208','WY040209','WY040210','WY040211','WY040212','WY040213','WY040214','WY040215','WY040216')
)A
LEFT JOIN
(
SELECT
year -- 年
,month -- 月
,dimsubjectcode -- 调整组织机构编码
,dimaccountcode -- 调整预算科目编码
,originalcurrency -- 调整金额
FROM dw.dwd_cost_adjust_data_d -- 调整金额明细表
WHERE dimaccountcode IN('WY0402','WY040201','WY040202','WY040203','WY040204','WY040205','WY040206','WY040207','WY040208','WY040209','WY040210','WY040211','WY040212','WY040213','WY040214','WY040215','WY040216')
)B
ON A.dimaccountcode = B.dimaccountcode
AND A.dimsubjectcode = B.dimsubjectcode
AND A.yearname = B.year
AND A.monthname = B.month
UNION ALL
SELECT
A.yearname AS yearname -- 年
,A.monthname AS monthname -- 月
,'AC' AS cost_code -- 成本类型编码: LC:行政成本 AC:人力成本
,'人力成本' AS cost_name -- 成本类型名称
,A.dimsubjectcode AS dimsubjectcode -- 组织机构编码
,A.dimsubjectname AS dimsubjectname -- 组织机构名称
,A.totalcode AS totalcode -- 组织机构层级编码
,A.dimaccountcode AS dimaccountcode -- 预算科目编码
,A.dimaccountname AS dimaccountname -- 预算科目名称
,A.buget AS buget -- 预算金额
,A.occ AS occ -- 已占用金额
,A.realfee AS realfee -- 已使用金额
,A.available AS available -- 剩余可用金额
,A.budgetfee_rate AS budgetfee_rate -- 预算执行率
,COALESCE(B.originalcurrency,0) AS originalcurrency -- 调整金额
,ROUND((A.buget - COALESCE(B.originalcurrency,0)),2) AS target_fee -- 目标值
,A.realfee AS actual_fee -- 实际值
-- ,'' AS diff_amount -- 差额
-- ,'' AS implementation_rate -- 执行率
FROM
(
SELECT
dimaccountcode -- 预算科目编码
,dimaccountname -- 预算科目名称
,dimsubjectcode -- 组织机构编码
,dimsubjectname -- 组织机构名称
,yearname -- 年
,totalcode -- 组织机构层级编码
,monthname -- 月
,buget -- 预算金额
,occ -- 已占用金额
,realfee -- 已使用金额
,available -- 剩余可用金额
,budgetfee_rate -- 预算执行率
FROM dw.dwd_cost_budget_data_d -- 预算金额明细表
WHERE dimaccountcode IN('WY0401','WY040101','WY040102','WY040103','WY040104','WY040105','WY040106','WY040107','WY040108','WY040109','WY040110','WY040111','WY040112','WY040113','WY040114')
)A
LEFT JOIN
(
SELECT
year -- 年
,month -- 月
,dimsubjectcode -- 调整组织机构编码
,dimaccountcode -- 调整预算科目编码
,originalcurrency -- 调整金额
FROM dw.dwd_cost_adjust_data_d -- 调整金额明细表
WHERE dimaccountcode IN('WY0401','WY040101','WY040102','WY040103','WY040104','WY040105','WY040106','WY040107','WY040108','WY040109','WY040110','WY040111','WY040112','WY040113','WY040114')
)B
ON A.dimaccountcode = B.dimaccountcode
AND A.dimsubjectcode = B.dimsubjectcode
AND A.yearname = B.year
AND A.monthname = B.month
)T1
LEFT JOIN
(
SELECT
organ_code -- erp片区id
,organ_name -- erp片区名称
,cost_comm_id -- 费控项目id
FROM dw.dim_organ_mapping -- 片区项目映射维度表
where cost_comm_id is not null
GROUP BY
organ_code -- erp片区id
,organ_name -- erp片区名称
,cost_comm_id -- 费控项目id
)T2
ON T1.dimsubjectcode = T2.cost_comm_id
;
3. 优化SQL查询
-
避免使用
select * from xxx
,需要哪些字段,select哪些字段即可; -
需要where过滤的的,在关联前进行过滤,避免关联后再进行过滤;
-
较为复杂的转换加工进行落表;