紧跟上一篇记录,在本次开发中需要处理四张表,对其中一个EV同比增速情况进行计算。其中两张表的时间周期以“22Q1”/"22Q2"/"22Q3"/"22Y"的形式展示。如图:
我的理解是在报告周期上把数据切割开,形成年度和周期两个字段,和另外两张表一个形式,如图:
接下来是实现sql:
CREATE OR REPLACE VIEW "DATAHUB"."CONSENSUS_FORECAST_US" AS
WITH t1 AS (
SELECT
TICKER_AND_EXCH_CODE
,SHORT_NAME
,CASE
WHEN SUBSTR(BEST_FPERIOD_OVERRIDE, -1, 1) = 'Y' THEN SUBSTR(BEST_FPERIOD_OVERRIDE, 1,2)
WHEN SUBSTR(BEST_FPERIOD_OVERRIDE, -2, 1) LIKE 'Q%' THEN SUBSTR(BEST_FPERIOD_OVERRIDE, 1,2)
END AS EQY_FUND_YEAR ----年度
,CASE
WHEN SUBSTR(BEST_FPERIOD_OVERRIDE, -1, 1) = 'Y' THEN SUBSTR(BEST_FPERIOD_OVERRIDE, -1)
WHEN SUBSTR(BEST_FPERIOD_OVERRIDE, -2, 2) LIKE 'Q%' THEN SUBSTR(BEST_FPERIOD_OVERRIDE, -2)
END AS FUND_PER ----财报周期
,BEST_SALES
,BEST_SALES_YOY_GTH
,BEST_NET_INCOME
,BEST_NET_YOY_GTH
,BEST_EPS
,BEST_EPS_YOY_GTH
,BEST_EV
,BEST_EV_YOY
,BEST_BPS
,BEST_BPS_YOY_GTH
,BEST_PE_RATIO
,BEST_PX_BPS_RATIO
,SRCSYS
,DOWNLOADTIME
,TX_DATE
FROM
USER.CONSENSUS_FORECAST_US_STOCK
),
t2 AS (
SELECT *
FROM t1
WHERE EQY_FUND_YEAR IN (SELECT MAX(EQY_FUND_YEAR) FROM t1)
), ---获取最新一年数据
t3 AS (
SELECT *
FROM t1
WHERE EQY_FUND_YEAR IN (SELECT MAX(EQY_FUND_YEAR) - 1 FROM t1)
) ---获取上一年数据
SELECT
t2.TICKER_AND_EXCH_CODE,
t2.SHORT_NAME,
t2.EQY_FUND_YEAR,
t2.FUND_PER,
t2.BEST_SALES,
t2.BEST_SALES_YOY_GTH,
t2.BEST_NET_INCOME,
t2.BEST_NET_YOY_GTH,
t2.BEST_EPS,
t2.BEST_EPS_YOY_GTH,
t2.BEST_EV,
CASE
WHEN t3.BEST_EV > 0 THEN
CONCAT( ROUND(((t2.BEST_EV - t3.BEST_EV) / t3.BEST_EV),6) * 100, '%' )
ELSE
'同期没有数据'
END AS BEST_EV_YOY, ---同比=(今年同期-去年同期)/去年同期,这里保留需求方要求的百分号后面四位小数
t2.BEST_BPS,
t2.BEST_BPS_YOY_GTH,
t2.BEST_PE_RATIO,
t2.BEST_PX_BPS_RATIO,
t2.SRCSYS,
t2.DOWNLOADTIME,
t2.TX_DATE
FROM t2
LEFT JOIN t3
ON t2.TICKER_AND_EXCH_CODE = t3.TICKER_AND_EXCH_CODE
AND t2.FUND_PER = t3.FUND_PER
AND t2.EQY_FUND_YEAR = t3.EQY_FUND_YEAR + 1;
另外,我的最终结果是以Oracle视图形式呈现,所以前面加了个创建视图表语句。给到的样例数据只有一年,所以结果没有显示增速信息。
另一张表中我造了一条数据,就可以正常体现结果